• 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 
34 enum class ThumbnailTaskType {
35     FOREGROUND,
36     BACKGROUND,
37     ASYNC_UPDATE_RDB,
38 };
39 
40 enum class ThumbnailTaskPriority {
41     HIGH,
42     MID,
43     LOW,
44 };
45 
46 class ThumbnailTaskData {
47 public:
48     ThumbnailTaskData() = default;
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data)49     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data) : opts_(opts), thumbnailData_(data) {}
50 
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data,int32_t requestId)51     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data,
52         int32_t requestId) : opts_(opts), thumbnailData_(data), requestId_(requestId) {}
53 
54     ~ThumbnailTaskData() = default;
55 
56     ThumbRdbOpt opts_;
57     ThumbnailData thumbnailData_;
58     int32_t requestId_ = 0;
59 };
60 
61 using ThumbnailGenerateExecute = void (*)(std::shared_ptr<ThumbnailTaskData> &data);
62 
63 class ExecuteParamBuilder {
64 public:
65     ExecuteParamBuilder() = default;
66     ~ExecuteParamBuilder() = default;
67     int32_t tempLimit_ { -1 };
68     int32_t batteryLimit_ { -1 };
69     CpuAffinityType affinity_ { CpuAffinityType::CPU_IDX_DEFAULT };
70 };
71 
72 class ThumbnailGeneratorWrapper {
73 public:
74     ThumbnailGeneratorWrapper() = default;
75     ~ThumbnailGeneratorWrapper() = default;
ThumbnailGeneratorWrapper(ThumbnailGenerateExecute execute,std::shared_ptr<ExecuteParamBuilder> param)76     ThumbnailGeneratorWrapper(ThumbnailGenerateExecute execute,
77         std::shared_ptr<ExecuteParamBuilder> param) : executor_(execute), executeParam_(param) {};
78     void operator()(std::shared_ptr<ThumbnailTaskData> &data);
79 private:
80     bool IsPreconditionFullfilled();
81     void BeforeExecute();
82     ThumbnailGenerateExecute executor_ { nullptr };
83     std::shared_ptr<ExecuteParamBuilder> executeParam_ { nullptr };
84 };
85 
86 class ThumbnailGenerateTask {
87 public:
88     ThumbnailGenerateTask(ThumbnailGenerateExecute executor,
89         std::shared_ptr<ThumbnailTaskData> &data,
executor_(executor,param)90         std::shared_ptr<ExecuteParamBuilder> param = nullptr) : executor_(executor, param), data_(data) {}
91     ~ThumbnailGenerateTask() = default;
92     ThumbnailGeneratorWrapper executor_;
93     std::shared_ptr<ThumbnailTaskData> data_;
94 };
95 
96 class ThumbnailGenerateThreadStatus {
97 public:
ThumbnailGenerateThreadStatus(int threadId)98     ThumbnailGenerateThreadStatus(int threadId) : threadId_(threadId) {}
99     ~ThumbnailGenerateThreadStatus() = default;
100     int threadId_;
101     bool isThreadWaiting_ = false;
102     int32_t taskNum_ = 0;
103     CpuAffinityType cpuAffinityType = CpuAffinityType::CPU_IDX_DEFAULT;
104     CpuAffinityType cpuAffinityTypeLowPriority = CpuAffinityType::CPU_IDX_DEFAULT;
105 };
106 
107 class ThumbnailGenerateWorker {
108 public:
109     EXPORT ThumbnailGenerateWorker() = default;
110     EXPORT ~ThumbnailGenerateWorker();
111     EXPORT int32_t Init(const ThumbnailTaskType &taskType);
112     EXPORT int32_t ReleaseTaskQueue(const ThumbnailTaskPriority &taskPriority);
113     EXPORT int32_t AddTask(
114         const std::shared_ptr<ThumbnailGenerateTask> &task, const ThumbnailTaskPriority &taskPriority);
115     EXPORT void IgnoreTaskByRequestId(int32_t requestId);
116     EXPORT void TryCloseTimer();
117     EXPORT bool IsLowerQueueEmpty();
118 
119 private:
120     void StartWorker(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
121     bool WaitForTask(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
122 
123     bool NeedIgnoreTask(int32_t requestId);
124     void IncreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
125     void DecreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
126     void NotifyTaskFinished(int32_t requestId);
127     void ClearWorkerThreads();
128     void TryClearWorkerThreads();
129     void RegisterWorkerTimer();
130     bool IsAllThreadWaiting();
131 
132     ThumbnailTaskType taskType_;
133 
134     std::atomic<bool> isThreadRunning_ = false;
135     std::list<std::thread> threads_;
136     std::list<std::shared_ptr<ThumbnailGenerateThreadStatus>> threadsStatus_;
137 
138     std::mutex workerLock_;
139     std::condition_variable workerCv_;
140 
141     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> highPriorityTaskQueue_;
142     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> midPriorityTaskQueue_;
143     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> lowPriorityTaskQueue_;
144 
145     std::atomic<int32_t> ignoreRequestId_ = 0;
146     std::map<int32_t, int32_t> requestIdTaskMap_;
147     std::mutex requestIdMapLock_;
148 
149     Utils::Timer timer_{"closeThumbnailWorker"};
150     uint32_t timerId_ = 0;
151     std::mutex timerMutex_;
152     std::mutex taskMutex_;
153 };
154 } // namespace Media
155 } // namespace OHOS
156 
157 #endif //FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H
158