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