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:
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 class ThumbnailGenerateTask {
63 public:
ThumbnailGenerateTask(ThumbnailGenerateExecute executor,std::shared_ptr<ThumbnailTaskData> & data)64     ThumbnailGenerateTask(ThumbnailGenerateExecute executor,
65         std::shared_ptr<ThumbnailTaskData> &data) : executor_(executor), data_(data) {}
66     ~ThumbnailGenerateTask() = default;
67     ThumbnailGenerateExecute executor_;
68     std::shared_ptr<ThumbnailTaskData> data_;
69 };
70 
71 class ThumbnailGenerateThreadStatus {
72 public:
ThumbnailGenerateThreadStatus(int threadId)73     ThumbnailGenerateThreadStatus(int threadId) : threadId_(threadId) {}
74     ~ThumbnailGenerateThreadStatus() = default;
75     int threadId_;
76     bool isThreadWaiting_ = false;
77     int32_t taskNum_ = 0;
78     CpuAffinityType cpuAffinityType = CpuAffinityType::CPU_IDX_DEFAULT;
79 };
80 
81 class ThumbnailGenerateWorker {
82 public:
83     EXPORT ThumbnailGenerateWorker() = default;
84     EXPORT ~ThumbnailGenerateWorker();
85     EXPORT int32_t Init(const ThumbnailTaskType &taskType);
86     EXPORT int32_t ReleaseTaskQueue(const ThumbnailTaskPriority &taskPriority);
87     EXPORT int32_t AddTask(
88         const std::shared_ptr<ThumbnailGenerateTask> &task, const ThumbnailTaskPriority &taskPriority);
89     EXPORT void IgnoreTaskByRequestId(int32_t requestId);
90     EXPORT void TryCloseTimer();
91 
92 private:
93     void StartWorker(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
94     bool WaitForTask(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
95 
96     bool NeedIgnoreTask(int32_t requestId);
97     void IncreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
98     void DecreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
99     void NotifyTaskFinished(int32_t requestId);
100     void ClearWorkerThreads();
101     void TryClearWorkerThreads();
102     void RegisterWorkerTimer();
103     bool IsAllThreadWaiting();
104 
105     ThumbnailTaskType taskType_;
106 
107     std::atomic<bool> isThreadRunning_ = false;
108     std::list<std::thread> threads_;
109     std::list<std::shared_ptr<ThumbnailGenerateThreadStatus>> threadsStatus_;
110 
111     std::mutex workerLock_;
112     std::condition_variable workerCv_;
113 
114     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> highPriorityTaskQueue_;
115     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> midPriorityTaskQueue_;
116     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> lowPriorityTaskQueue_;
117 
118     std::atomic<int32_t> ignoreRequestId_ = 0;
119     std::map<int32_t, int32_t> requestIdTaskMap_;
120     std::mutex requestIdMapLock_;
121 
122     Utils::Timer timer_{"closeThumbnailWorker"};
123     uint32_t timerId_ = 0;
124     std::mutex timerMutex_;
125     std::mutex taskMutex_;
126 };
127 } // namespace Media
128 } // namespace OHOS
129 
130 #endif //FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H