• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H
17 #define FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H
18 
19 #include <atomic>
20 #include <condition_variable>
21 #include <list>
22 #include <mutex>
23 #include <safe_queue.h>
24 #include <thread>
25 #include <timer.h>
26 
27 #include "cpu_utils.h"
28 #include "thumbnail_utils.h"
29 
30 namespace OHOS {
31 namespace Media {
32 #define EXPORT __attribute__ ((visibility ("default")))
33 const std::string THREAD_NAME_FOREGROUND = "ThumbForeground";
34 const std::string THREAD_NAME_BACKGROUND = "ThumbBackground";
35 
36 enum class ThumbnailTaskType {
37     FOREGROUND,
38     BACKGROUND,
39 };
40 
41 enum class ThumbnailTaskPriority {
42     HIGH,
43     MID,
44     LOW,
45 };
46 
47 class ThumbnailTaskData {
48 public:
49     ThumbnailTaskData() = default;
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data)50     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data) : opts_(opts), thumbnailData_(data) {}
51 
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data,int32_t requestId)52     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data,
53         int32_t requestId) : opts_(opts), thumbnailData_(data), requestId_(requestId) {}
54 
55     ~ThumbnailTaskData() = default;
56 
57     ThumbRdbOpt opts_;
58     ThumbnailData thumbnailData_;
59     int32_t requestId_ = 0;
60 };
61 
62 using ThumbnailGenerateExecute = void (*)(std::shared_ptr<ThumbnailTaskData> &data);
63 
64 class ExecuteParamBuilder {
65 public:
66     ExecuteParamBuilder() = default;
67     ~ExecuteParamBuilder() = default;
68     int32_t tempLimit_ { -1 };
69     int32_t batteryLimit_ { -1 };
70     CpuAffinityType affinity_ { CpuAffinityType::CPU_IDX_DEFAULT };
71 };
72 
73 class ThumbnailGeneratorWrapper {
74 public:
75     ThumbnailGeneratorWrapper() = default;
76     ~ThumbnailGeneratorWrapper() = default;
ThumbnailGeneratorWrapper(ThumbnailGenerateExecute execute,std::shared_ptr<ExecuteParamBuilder> param)77     ThumbnailGeneratorWrapper(ThumbnailGenerateExecute execute,
78         std::shared_ptr<ExecuteParamBuilder> param) : executor_(execute), executeParam_(param) {};
79     void operator()(std::shared_ptr<ThumbnailTaskData> &data);
80 private:
81     bool IsPreconditionFullfilled();
82     void BeforeExecute();
83     ThumbnailGenerateExecute executor_ { nullptr };
84     std::shared_ptr<ExecuteParamBuilder> executeParam_ { nullptr };
85 };
86 
87 class ThumbnailGenerateTask {
88 public:
89     ThumbnailGenerateTask(ThumbnailGenerateExecute executor,
90         std::shared_ptr<ThumbnailTaskData> &data,
executor_(executor,param)91         std::shared_ptr<ExecuteParamBuilder> param = nullptr) : executor_(executor, param), data_(data) {}
92     ~ThumbnailGenerateTask() = default;
93     ThumbnailGeneratorWrapper executor_;
94     std::shared_ptr<ThumbnailTaskData> data_;
95 };
96 
97 class ThumbnailGenerateThreadStatus {
98 public:
ThumbnailGenerateThreadStatus(int threadId)99     ThumbnailGenerateThreadStatus(int threadId) : threadId_(threadId) {}
100     ~ThumbnailGenerateThreadStatus() = default;
101     int threadId_;
102     bool isThreadWaiting_ = false;
103     int32_t taskNum_ = 0;
104     CpuAffinityType cpuAffinityType = CpuAffinityType::CPU_IDX_DEFAULT;
105     CpuAffinityType cpuAffinityTypeLowPriority = CpuAffinityType::CPU_IDX_DEFAULT;
106 };
107 
108 class ThumbnailGenerateWorker {
109 public:
110     EXPORT ThumbnailGenerateWorker() = default;
111     EXPORT ~ThumbnailGenerateWorker();
112     EXPORT int32_t Init(const ThumbnailTaskType &taskType);
113     EXPORT int32_t ReleaseTaskQueue(const ThumbnailTaskPriority &taskPriority);
114     EXPORT int32_t AddTask(
115         const std::shared_ptr<ThumbnailGenerateTask> &task, const ThumbnailTaskPriority &taskPriority);
116     EXPORT void IgnoreTaskByRequestId(int32_t requestId);
117     EXPORT void TryCloseTimer();
118     EXPORT bool IsLowerQueueEmpty();
119 
120 private:
121     void StartWorker(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
122     bool WaitForTask(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
123 
124     bool NeedIgnoreTask(int32_t requestId);
125     void IncreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
126     void DecreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
127     void NotifyTaskFinished(int32_t requestId);
128     void ClearWorkerThreads();
129     void TryClearWorkerThreads();
130     void RegisterWorkerTimer();
131     bool IsAllThreadWaiting();
132 
133     ThumbnailTaskType taskType_;
134 
135     std::atomic<bool> isThreadRunning_ = false;
136     std::list<std::thread> threads_;
137     std::list<std::shared_ptr<ThumbnailGenerateThreadStatus>> threadsStatus_;
138 
139     std::mutex workerLock_;
140     std::condition_variable workerCv_;
141 
142     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> highPriorityTaskQueue_;
143     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> midPriorityTaskQueue_;
144     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> lowPriorityTaskQueue_;
145 
146     std::atomic<int32_t> ignoreRequestId_ = 0;
147     std::map<int32_t, int32_t> requestIdTaskMap_;
148     std::mutex requestIdMapLock_;
149 
150     Utils::Timer timer_{"closeThumbnailWorker"};
151     uint32_t timerId_ = 0;
152     std::mutex timerMutex_;
153     std::mutex taskMutex_;
154 };
155 } // namespace Media
156 } // namespace OHOS
157 
158 #endif //FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H
159