• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 MAPLE_UTIL_INCLUDE_MPLSCHEDULER_H
17 #define MAPLE_UTIL_INCLUDE_MPLSCHEDULER_H
18 
19 #include <vector>
20 #include <set>
21 #include <thread>
22 #include <mutex>
23 #include <condition_variable>
24 #include <inttypes.h>
25 #include <pthread.h>
26 #include <inttypes.h>
27 #include <iostream>
28 #include <string>
29 #include "types_def.h"
30 
31 namespace maple {
32 class MplTaskParam {
33 public:
34     MplTaskParam() = default;
35     virtual ~MplTaskParam() = default;
36 };
37 
38 class MplTask {
39 public:
MplTask()40     MplTask() : taskId(0) {}
41 
42     virtual ~MplTask() = default;
43 
SetTaskId(uint32 id)44     void SetTaskId(uint32 id)
45     {
46         taskId = id;
47     }
48 
GetTaskId()49     uint32 GetTaskId() const
50     {
51         return taskId;
52     }
53 
54     int Run(MplTaskParam *param = nullptr)
55     {
56         return RunImpl(param);
57     }
58 
59     int Finish(MplTaskParam *param = nullptr)
60     {
61         return FinishImpl(param);
62     }
63 
64 protected:
RunImpl(MplTaskParam *)65     virtual int RunImpl(MplTaskParam *)
66     {
67         return 0;
68     }
69 
FinishImpl(MplTaskParam *)70     virtual int FinishImpl(MplTaskParam *)
71     {
72         return 0;
73     }
74 
75     uint32 taskId;
76 };
77 
78 class MplSchedulerParam {
79 public:
80     MplSchedulerParam() = default;
81     ~MplSchedulerParam() = default;
82 };
83 
84 class MplScheduler {
85 public:
86     explicit MplScheduler(const std::string &name);
87     virtual ~MplScheduler() = default;
88 
89     void Init();
90     virtual void AddTask(MplTask &task);
91     virtual int RunTask(uint32 threadsNum, bool seq = false);
EncodeThreadMainEnvironment(uint32)92     virtual MplSchedulerParam *EncodeThreadMainEnvironment(uint32)
93     {
94         return nullptr;
95     }
96 
DecodeThreadMainEnvironment(MplSchedulerParam *)97     virtual void DecodeThreadMainEnvironment(MplSchedulerParam *) {}
98 
EncodeThreadFinishEnvironment()99     virtual MplSchedulerParam *EncodeThreadFinishEnvironment()
100     {
101         return nullptr;
102     }
103 
DecodeThreadFinishEnvironment(MplSchedulerParam *)104     virtual void DecodeThreadFinishEnvironment(MplSchedulerParam *) {}
105 
GlobalLock()106     void GlobalLock()
107     {
108         pthread_mutex_lock(&mutexGlobal);
109     }
110 
GlobalUnlock()111     void GlobalUnlock()
112     {
113         pthread_mutex_unlock(&mutexGlobal);
114     }
115 
116     void Reset();
117 
118 protected:
119     std::string schedulerName;
120     std::vector<MplTask *> tbTasks;
121     std::set<uint32> tbTaskIdsToFinish;
122     uint32 taskIdForAdd;
123     uint32 taskIdToRun;
124     uint32 taskIdExpected;
125     uint32 numberTasks;
126     uint32 numberTasksFinish;
127     pthread_mutex_t mutexTaskIdsToRun;
128     pthread_mutex_t mutexTaskIdsToFinish;
129     pthread_mutex_t mutexTaskFinishProcess;
130     pthread_mutex_t mutexGlobal;
131     pthread_cond_t conditionFinishProcess;
132     bool isSchedulerSeq;
133     bool dumpTime;
134 
135     enum ThreadStatus { kThreadStop, kThreadRun, kThreadPause };
136 
137     ThreadStatus statusFinish;
138     virtual int FinishTask(const MplTask &task);
139     virtual MplTask *GetTaskToRun();
140     virtual size_t GetTaskIdsFinishSize();
141     virtual MplTask *GetTaskFinishFirst();
142     virtual void RemoveTaskFinish(uint32 id);
143     virtual void TaskIdFinish(uint32 id);
144     void ThreadMain(uint32 threadID, MplSchedulerParam *env);
145     void ThreadFinishNoSequence(MplSchedulerParam *env);
146     void ThreadFinishSequence(MplSchedulerParam *env);
147     void ThreadFinish(MplSchedulerParam *env);
148     // Callback Function
CallbackThreadMainStart()149     virtual void CallbackThreadMainStart() {}
150 
CallbackThreadMainEnd()151     virtual void CallbackThreadMainEnd() {}
152 
CallbackThreadFinishStart()153     virtual void CallbackThreadFinishStart() {}
154 
CallbackThreadFinishEnd()155     virtual void CallbackThreadFinishEnd() {}
156 
CallbackGetTaskRunParam()157     virtual MplTaskParam *CallbackGetTaskRunParam() const
158     {
159         return nullptr;
160     }
161 
CallbackGetTaskFinishParam()162     virtual MplTaskParam *CallbackGetTaskFinishParam() const
163     {
164         return nullptr;
165     }
166 };
167 }  // namespace maple
168 #endif  // MAPLE_UTIL_INCLUDE_MPLSCHEDULER_H
169