1 /* 2 * Copyright (C) 2022 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_SERVICE_MEDIA_ASYNC_WORKER_INCLUDE_MEDIALIBRARY_ASYNC_WORKER_H_ 17 #define FRAMEWORKS_SERVICE_MEDIA_ASYNC_WORKER_INCLUDE_MEDIALIBRARY_ASYNC_WORKER_H_ 18 19 #include <atomic> 20 #include <condition_variable> 21 #include <list> 22 #include <mutex> 23 #include <queue> 24 #include <thread> 25 26 #define ASYNC_WORKER_API_EXPORT __attribute__ ((visibility ("default"))) 27 namespace OHOS { 28 namespace Media { 29 #define COMPILE_HIDDEN __attribute__ ((visibility ("hidden"))) 30 class AsyncTaskData { 31 public: AsyncTaskData()32 AsyncTaskData() {}; ~AsyncTaskData()33 virtual ~AsyncTaskData() {}; 34 std::string dataDisplay; 35 }; 36 37 using MediaLibraryExecute = void (*)(AsyncTaskData *data); 38 enum TaskType {REFRESH_ALBUM, BUTT}; 39 40 class MediaLibraryAsyncTask { 41 public: 42 MediaLibraryAsyncTask(MediaLibraryExecute executor, AsyncTaskData *data, TaskType taskType = BUTT) 43 : executor_(executor), data_(data), taskType_(taskType) {} MediaLibraryAsyncTask()44 MediaLibraryAsyncTask() : MediaLibraryAsyncTask(nullptr, nullptr, BUTT) {} ~MediaLibraryAsyncTask()45 virtual ~MediaLibraryAsyncTask() 46 { 47 delete data_; 48 data_ = nullptr; 49 } 50 51 MediaLibraryExecute executor_; 52 AsyncTaskData *data_; 53 TaskType taskType_; 54 }; 55 56 class MediaLibraryAsyncWorker { 57 public: 58 virtual ~MediaLibraryAsyncWorker(); 59 ASYNC_WORKER_API_EXPORT static std::shared_ptr<MediaLibraryAsyncWorker> GetInstance(); 60 ASYNC_WORKER_API_EXPORT void Interrupt(); 61 ASYNC_WORKER_API_EXPORT void Stop(); 62 ASYNC_WORKER_API_EXPORT int32_t AddTask(const std::shared_ptr<MediaLibraryAsyncTask> &task, bool isFg); 63 ASYNC_WORKER_API_EXPORT void ClearRefreshTaskQueue(); 64 65 private: 66 COMPILE_HIDDEN MediaLibraryAsyncWorker(); 67 COMPILE_HIDDEN void StartWorker(int num); 68 COMPILE_HIDDEN void Init(); 69 COMPILE_HIDDEN std::shared_ptr<MediaLibraryAsyncTask> GetFgTask(); 70 COMPILE_HIDDEN std::shared_ptr<MediaLibraryAsyncTask> GetBgTask(); 71 COMPILE_HIDDEN void ReleaseFgTask(); 72 COMPILE_HIDDEN void ReleaseBgTask(); 73 COMPILE_HIDDEN void WaitForTask(); 74 COMPILE_HIDDEN bool IsFgQueueEmpty(); 75 COMPILE_HIDDEN bool IsBgQueueEmpty(); 76 COMPILE_HIDDEN void SleepFgWork(); 77 COMPILE_HIDDEN void SleepBgWork(); 78 79 COMPILE_HIDDEN static std::mutex instanceLock_; 80 COMPILE_HIDDEN static std::shared_ptr<MediaLibraryAsyncWorker> asyncWorkerInstance_; 81 COMPILE_HIDDEN std::atomic<bool> isThreadRunning_; 82 COMPILE_HIDDEN std::mutex bgTaskLock_; 83 COMPILE_HIDDEN std::queue<std::shared_ptr<MediaLibraryAsyncTask>> bgTaskQueue_; 84 85 COMPILE_HIDDEN std::mutex fgTaskLock_; 86 COMPILE_HIDDEN std::queue<std::shared_ptr<MediaLibraryAsyncTask>> fgTaskQueue_; 87 88 COMPILE_HIDDEN std::mutex bgWorkLock_; 89 COMPILE_HIDDEN std::condition_variable bgWorkCv_; 90 COMPILE_HIDDEN std::atomic<uint32_t> doneTotal_; 91 92 COMPILE_HIDDEN std::list<std::thread> threads_; 93 }; 94 } // namespace Media 95 } // namespace OHOS 96 97 #endif // FRAMEWORKS_SERVICE_MEDIA_ASYNC_WORKER_INCLUDE_MEDIALIBRARY_ASYNC_WORKER_H_