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 #include "c/ffrt_watchdog.h"
16 #include "internal_inc/osal.h"
17 #include "dfx/bbox/bbox.h"
18
19 namespace ffrt {
20 constexpr uint32_t DEFAULT_TIMEOUT_MS = 30000;
21 struct WatchdogCfg {
Instanceffrt::WatchdogCfg22 static inline WatchdogCfg* Instance()
23 {
24 static WatchdogCfg inst;
25 return &inst;
26 }
27
28 uint32_t timeout = DEFAULT_TIMEOUT_MS;
29 uint32_t interval = DEFAULT_TIMEOUT_MS;
30 ffrt_watchdog_cb callback = nullptr;
31 };
32 }
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 API_ATTRIBUTE((visibility("default")))
ffrt_watchdog_dumpinfo(char * buf,uint32_t len)38 void ffrt_watchdog_dumpinfo(char *buf, uint32_t len)
39 {
40 if (FFRTIsWork()) {
41 std::string dumpInfo;
42 dumpInfo += SaveTaskCounterInfo();
43 dumpInfo += SaveWorkerStatusInfo();
44 dumpInfo += SaveReadyQueueStatusInfo();
45 dumpInfo += SaveTaskStatusInfo();
46 snprintf(buf, len, "%s", dumpInfo.c_str());
47 } else {
48 snprintf(buf, len, "%s", "FFRT has done all tasks!");
49 }
50 }
51
52 API_ATTRIBUTE((visibility("default")))
ffrt_watchdog_register(ffrt_watchdog_cb cb,uint32_t timeout_ms,uint32_t interval_ms)53 void ffrt_watchdog_register(ffrt_watchdog_cb cb, uint32_t timeout_ms, uint32_t interval_ms)
54 {
55 ffrt::WatchdogCfg::Instance()->callback = cb;
56 ffrt::WatchdogCfg::Instance()->timeout = timeout_ms;
57 ffrt::WatchdogCfg::Instance()->interval = interval_ms;
58 }
59
60 API_ATTRIBUTE((visibility("default")))
ffrt_watchdog_get_cb(void)61 ffrt_watchdog_cb ffrt_watchdog_get_cb(void)
62 {
63 return ffrt::WatchdogCfg::Instance()->callback;
64 }
65
66 API_ATTRIBUTE((visibility("default")))
ffrt_watchdog_get_timeout(void)67 uint32_t ffrt_watchdog_get_timeout(void)
68 {
69 return ffrt::WatchdogCfg::Instance()->timeout;
70 }
71
72 API_ATTRIBUTE((visibility("default")))
ffrt_watchdog_get_interval(void)73 uint32_t ffrt_watchdog_get_interval(void)
74 {
75 return ffrt::WatchdogCfg::Instance()->interval;
76 }
77 #ifdef __cplusplus
78 }
79 #endif
80