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 #define MLOG_TAG "EnhancementThreadManager"
17
18 #include "enhancement_thread_manager.h"
19
20 #include "enhancement_service_callback.h"
21 #include "media_log.h"
22
23 using namespace std;
24
25 namespace OHOS {
26 namespace Media {
27 static constexpr int32_t WAIT_TIME = 30;
28
EnhancementThreadManager()29 EnhancementThreadManager::EnhancementThreadManager()
30 {
31 stop = false;
32 #ifdef ABILITY_CLOUD_ENHANCEMENT_SUPPORT
33 isThreadAlive = true;
34 thread(&EnhancementThreadManager::DealWithTasks, this).detach();
35 #endif
36 }
37
~EnhancementThreadManager()38 EnhancementThreadManager::~EnhancementThreadManager()
39 {
40 {
41 lock_guard<mutex> lock(queueMutex_);
42 stop = true;
43 }
44 condVar_.notify_all();
45 }
46
StartConsumerThread()47 void EnhancementThreadManager::StartConsumerThread()
48 {
49 if (!isThreadAlive) {
50 isThreadAlive = true;
51 thread(&EnhancementThreadManager::DealWithTasks, this).detach();
52 }
53 }
54
OnProducerCallback(CloudEnhancementThreadTask & task)55 void EnhancementThreadManager::OnProducerCallback(CloudEnhancementThreadTask& task)
56 {
57 {
58 lock_guard<mutex> lock(queueMutex_);
59 taskQueue_.push(task);
60 StartConsumerThread();
61 }
62 condVar_.notify_one();
63 }
64
DealWithTasks()65 void EnhancementThreadManager::DealWithTasks()
66 {
67 MEDIA_INFO_LOG("cloud enhancement consumer thread start");
68 bool loopCondition = true;
69 while (loopCondition) {
70 bool needExtraWork = false;
71 CloudEnhancementThreadTask task("", 0, nullptr, 0, false);
72 {
73 unique_lock<mutex> lock(queueMutex_);
74 if (condVar_.wait_for(lock, chrono::seconds(WAIT_TIME), [this]() {
75 return !taskQueue_.empty() || stop;
76 })) {
77 if (stop && taskQueue_.empty()) {
78 loopCondition = false;
79 break;
80 }
81 task = taskQueue_.front();
82 taskQueue_.pop();
83
84 if (taskQueue_.empty()) {
85 needExtraWork = true;
86 }
87 } else {
88 loopCondition = false;
89 break;
90 }
91 }
92 if (task.taskId.empty()) {
93 continue;
94 }
95 task.isSuccessed ? ExecSuccessedTask(task) : ExecFailedTask(task);
96 if (needExtraWork) {
97 ExecExtraWork();
98 }
99 }
100 MEDIA_INFO_LOG("cloud enhancement thread task queue is empty for %{public}d seconds", WAIT_TIME);
101 isThreadAlive = false;
102 }
103
ExecSuccessedTask(CloudEnhancementThreadTask & task)104 void EnhancementThreadManager::ExecSuccessedTask(CloudEnhancementThreadTask& task)
105 {
106 #ifdef ABILITY_CLOUD_ENHANCEMENT_SUPPORT
107 EnhancementServiceCallback::DealWithSuccessedTask(task);
108 #endif
109 }
110
ExecFailedTask(CloudEnhancementThreadTask & task)111 void EnhancementThreadManager::ExecFailedTask(CloudEnhancementThreadTask& task)
112 {
113 #ifdef ABILITY_CLOUD_ENHANCEMENT_SUPPORT
114 EnhancementServiceCallback::DealWithFailedTask(task);
115 #endif
116 }
117
ExecExtraWork()118 void EnhancementThreadManager::ExecExtraWork()
119 {
120 #ifdef ABILITY_CLOUD_ENHANCEMENT_SUPPORT
121 EnhancementServiceCallback::UpdateAlbumsForCloudEnhancement();
122 #endif
123 }
124 } // namespace Media
125 } // namespace OHOS