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 39 class MediaLibraryAsyncTask { 40 public: MediaLibraryAsyncTask(MediaLibraryExecute executor,AsyncTaskData * data)41 MediaLibraryAsyncTask(MediaLibraryExecute executor, AsyncTaskData *data) : executor_(executor), data_(data) {} MediaLibraryAsyncTask()42 MediaLibraryAsyncTask() : MediaLibraryAsyncTask(nullptr, nullptr) {} ~MediaLibraryAsyncTask()43 virtual ~MediaLibraryAsyncTask() 44 { 45 delete data_; 46 data_ = nullptr; 47 } 48 49 MediaLibraryExecute executor_; 50 AsyncTaskData *data_; 51 }; 52 53 class MediaLibraryAsyncWorker { 54 public: 55 virtual ~MediaLibraryAsyncWorker(); 56 ASYNC_WORKER_API_EXPORT static std::shared_ptr<MediaLibraryAsyncWorker> GetInstance(); 57 ASYNC_WORKER_API_EXPORT void Interrupt(); 58 ASYNC_WORKER_API_EXPORT void Stop(); 59 ASYNC_WORKER_API_EXPORT int32_t AddTask(const std::shared_ptr<MediaLibraryAsyncTask> &task, bool isFg); 60 61 private: 62 COMPILE_HIDDEN MediaLibraryAsyncWorker(); 63 COMPILE_HIDDEN void StartWorker(int num); 64 COMPILE_HIDDEN void Init(); 65 COMPILE_HIDDEN std::shared_ptr<MediaLibraryAsyncTask> GetFgTask(); 66 COMPILE_HIDDEN std::shared_ptr<MediaLibraryAsyncTask> GetBgTask(); 67 COMPILE_HIDDEN void ReleaseFgTask(); 68 COMPILE_HIDDEN void ReleaseBgTask(); 69 COMPILE_HIDDEN void WaitForTask(); 70 COMPILE_HIDDEN bool IsFgQueueEmpty(); 71 COMPILE_HIDDEN bool IsBgQueueEmpty(); 72 COMPILE_HIDDEN void SleepFgWork(); 73 COMPILE_HIDDEN void SleepBgWork(); 74 75 COMPILE_HIDDEN static std::mutex instanceLock_; 76 COMPILE_HIDDEN static std::shared_ptr<MediaLibraryAsyncWorker> asyncWorkerInstance_; 77 COMPILE_HIDDEN std::atomic<bool> isThreadRunning_; 78 COMPILE_HIDDEN std::mutex bgTaskLock_; 79 COMPILE_HIDDEN std::queue<std::shared_ptr<MediaLibraryAsyncTask>> bgTaskQueue_; 80 81 COMPILE_HIDDEN std::mutex fgTaskLock_; 82 COMPILE_HIDDEN std::queue<std::shared_ptr<MediaLibraryAsyncTask>> fgTaskQueue_; 83 84 COMPILE_HIDDEN std::mutex bgWorkLock_; 85 COMPILE_HIDDEN std::condition_variable bgWorkCv_; 86 COMPILE_HIDDEN std::atomic<uint32_t> doneTotal_; 87 88 COMPILE_HIDDEN std::list<std::thread> threads_; 89 }; 90 } // namespace Media 91 } // namespace OHOS 92 93 #endif // FRAMEWORKS_SERVICE_MEDIA_ASYNC_WORKER_INCLUDE_MEDIALIBRARY_ASYNC_WORKER_H_