• 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 "thumbnail_utils.h"
28 
29 namespace OHOS {
30 namespace Media {
31 #define EXPORT __attribute__ ((visibility ("default")))
32 const std::string THREAD_NAME_FOREGROUND = "ThumbForeground";
33 const std::string THREAD_NAME_BACKGROUND = "ThumbBackground";
34 
35 enum class ThumbnailTaskType {
36     FOREGROUND,
37     BACKGROUND,
38 };
39 
40 enum class ThumbnailTaskPriority {
41     HIGH,
42     MID,
43     LOW,
44 };
45 
46 class ThumbnailTaskData {
47 public:
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data)48     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data) : opts_(opts), thumbnailData_(data) {}
49 
ThumbnailTaskData(ThumbRdbOpt & opts,ThumbnailData & data,int32_t requestId)50     ThumbnailTaskData(ThumbRdbOpt &opts, ThumbnailData &data,
51         int32_t requestId) : opts_(opts), thumbnailData_(data), requestId_(requestId) {}
52 
53     ~ThumbnailTaskData() = default;
54 
55     ThumbRdbOpt opts_;
56     ThumbnailData thumbnailData_;
57     int32_t requestId_ = 0;
58 };
59 
60 using ThumbnailGenerateExecute = void (*)(std::shared_ptr<ThumbnailTaskData> &data);
61 class ThumbnailGenerateTask {
62 public:
ThumbnailGenerateTask(ThumbnailGenerateExecute executor,std::shared_ptr<ThumbnailTaskData> & data)63     ThumbnailGenerateTask(ThumbnailGenerateExecute executor,
64         std::shared_ptr<ThumbnailTaskData> &data) : executor_(executor), data_(data) {}
65     ~ThumbnailGenerateTask() = default;
66     ThumbnailGenerateExecute executor_;
67     std::shared_ptr<ThumbnailTaskData> data_;
68 };
69 
70 class ThumbnailGenerateThreadStatus {
71 public:
ThumbnailGenerateThreadStatus(int threadId)72     ThumbnailGenerateThreadStatus(int threadId) : threadId_(threadId) {}
73     ~ThumbnailGenerateThreadStatus() = default;
74     int threadId_;
75     bool isThreadWaiting_ = false;
76     int32_t taskNum_ = 0;
77 };
78 
79 class ThumbnailGenerateWorker {
80 public:
81     EXPORT ThumbnailGenerateWorker() = default;
82     EXPORT ~ThumbnailGenerateWorker();
83     EXPORT int32_t Init(const ThumbnailTaskType &taskType);
84     EXPORT int32_t ReleaseTaskQueue(const ThumbnailTaskPriority &taskPriority);
85     EXPORT int32_t AddTask(
86         const std::shared_ptr<ThumbnailGenerateTask> &task, const ThumbnailTaskPriority &taskPriority);
87     EXPORT void IgnoreTaskByRequestId(int32_t requestId);
88     EXPORT void TryCloseTimer();
89 
90 private:
91     void StartWorker(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
92     bool WaitForTask(std::shared_ptr<ThumbnailGenerateThreadStatus> threadStatus);
93 
94     bool NeedIgnoreTask(int32_t requestId);
95     void IncreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
96     void DecreaseRequestIdTaskNum(const std::shared_ptr<ThumbnailGenerateTask> &task);
97     void NotifyTaskFinished(int32_t requestId);
98     void ClearWorkerThreads();
99     void TryClearWorkerThreads();
100     void RegisterWorkerTimer();
101     bool IsAllThreadWaiting();
102 
103     ThumbnailTaskType taskType_;
104 
105     std::atomic<bool> isThreadRunning_ = false;
106     std::list<std::thread> threads_;
107     std::list<std::shared_ptr<ThumbnailGenerateThreadStatus>> threadsStatus_;
108 
109     std::mutex workerLock_;
110     std::condition_variable workerCv_;
111 
112     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> highPriorityTaskQueue_;
113     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> midPriorityTaskQueue_;
114     SafeQueue<std::shared_ptr<ThumbnailGenerateTask>> lowPriorityTaskQueue_;
115 
116     std::atomic<int32_t> ignoreRequestId_ = 0;
117     std::map<int32_t, int32_t> requestIdTaskMap_;
118     std::mutex requestIdMapLock_;
119 
120     Utils::Timer timer_{"closeThumbnailWorker"};
121     uint32_t timerId_ = 0;
122     std::mutex timerMutex_;
123     std::mutex taskMutex_;
124 };
125 } // namespace Media
126 } // namespace OHOS
127 
128 #endif //FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_GENERATE_WORKER_H