147c9fbaeSopenharmony_ci/* 247c9fbaeSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 347c9fbaeSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 447c9fbaeSopenharmony_ci * you may not use this file except in compliance with the License. 547c9fbaeSopenharmony_ci * You may obtain a copy of the License at 647c9fbaeSopenharmony_ci * 747c9fbaeSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 847c9fbaeSopenharmony_ci * 947c9fbaeSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1047c9fbaeSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1147c9fbaeSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1247c9fbaeSopenharmony_ci * See the License for the specific language governing permissions and 1347c9fbaeSopenharmony_ci * limitations under the License. 1447c9fbaeSopenharmony_ci */ 1547c9fbaeSopenharmony_ci 1647c9fbaeSopenharmony_ci#include "blackbox.h" 1747c9fbaeSopenharmony_ci#include "blackbox_adapter.h" 1847c9fbaeSopenharmony_ci#include "blackbox_detector.h" 1947c9fbaeSopenharmony_ci#include "ohos_init.h" 2047c9fbaeSopenharmony_ci#include "ohos_types.h" 2147c9fbaeSopenharmony_ci#include "pthread.h" 2247c9fbaeSopenharmony_ci#include "securec.h" 2347c9fbaeSopenharmony_ci#include "utils_list.h" 2447c9fbaeSopenharmony_ci 2547c9fbaeSopenharmony_ci/******************local macroes*********************/ 2647c9fbaeSopenharmony_ci#define LOG_ROOT_DIR_WAIT_TIME 1000 2747c9fbaeSopenharmony_ci#define LOG_ROOT_DIR_WAIT_COUNT 1 2847c9fbaeSopenharmony_ci#ifndef LOS_WAIT_FOREVER 2947c9fbaeSopenharmony_ci#define LOS_WAIT_FOREVER 0xFFFFFFFF 3047c9fbaeSopenharmony_ci#endif 3147c9fbaeSopenharmony_ci#ifndef LOS_NO_WAIT 3247c9fbaeSopenharmony_ci#define LOS_NO_WAIT 0 3347c9fbaeSopenharmony_ci#endif 3447c9fbaeSopenharmony_ci#ifndef LOS_OK 3547c9fbaeSopenharmony_ci#define LOS_OK 0 3647c9fbaeSopenharmony_ci#endif 3747c9fbaeSopenharmony_ci 3847c9fbaeSopenharmony_ci/******************local prototypes******************/ 3947c9fbaeSopenharmony_cistruct BBoxOps { 4047c9fbaeSopenharmony_ci UTILS_DL_LIST opsList; 4147c9fbaeSopenharmony_ci struct ModuleOps ops; 4247c9fbaeSopenharmony_ci}; 4347c9fbaeSopenharmony_ci 4447c9fbaeSopenharmony_ci/******************global functions*******************/ 4547c9fbaeSopenharmony_ci/******************local variables*******************/ 4647c9fbaeSopenharmony_cistatic UTILS_DL_LIST_HEAD(g_opsList); 4747c9fbaeSopenharmony_cistatic unsigned int g_opsListSem; 4847c9fbaeSopenharmony_ci 4947c9fbaeSopenharmony_ci/******************function definitions*******************/ 5047c9fbaeSopenharmony_cistatic void GetDirName(char *dirBuf, unsigned int dirBufSize, const char *path) 5147c9fbaeSopenharmony_ci{ 5247c9fbaeSopenharmony_ci if (dirBuf == NULL || dirBufSize == 0 || path == NULL) { 5347c9fbaeSopenharmony_ci BBOX_PRINT_ERR("dirBuf: %p, dirBufSize: %u, path: %p!\n", dirBuf, dirBufSize, path); 5447c9fbaeSopenharmony_ci return; 5547c9fbaeSopenharmony_ci } 5647c9fbaeSopenharmony_ci 5747c9fbaeSopenharmony_ci const char *end = path + strlen(path); 5847c9fbaeSopenharmony_ci while (*end != '/' && end >= path) { 5947c9fbaeSopenharmony_ci end--; 6047c9fbaeSopenharmony_ci } 6147c9fbaeSopenharmony_ci if (end >= path) { 6247c9fbaeSopenharmony_ci (void)memset_s(dirBuf, dirBufSize, 0, dirBufSize); 6347c9fbaeSopenharmony_ci if (strncpy_s(dirBuf, dirBufSize - 1, path, end - path + strlen("/")) != EOK) { 6447c9fbaeSopenharmony_ci BBOX_PRINT_ERR("strncpy_s failed or the dirBuf is not enough!\n"); 6547c9fbaeSopenharmony_ci } 6647c9fbaeSopenharmony_ci } else { 6747c9fbaeSopenharmony_ci BBOX_PRINT_ERR("no / has been found!\n"); 6847c9fbaeSopenharmony_ci } 6947c9fbaeSopenharmony_ci} 7047c9fbaeSopenharmony_ci 7147c9fbaeSopenharmony_cistatic void FormatErrorInfo(struct ErrorInfo *info, 7247c9fbaeSopenharmony_ci const char event[EVENT_MAX_LEN], 7347c9fbaeSopenharmony_ci const char module[MODULE_MAX_LEN], 7447c9fbaeSopenharmony_ci const char errorDesc[ERROR_DESC_MAX_LEN]) 7547c9fbaeSopenharmony_ci{ 7647c9fbaeSopenharmony_ci if (info == NULL || event == NULL || module == NULL || errorDesc == NULL) { 7747c9fbaeSopenharmony_ci BBOX_PRINT_ERR("info: %p, event: %p, module: %p, errorDesc: %p\n", 7847c9fbaeSopenharmony_ci info, event, module, errorDesc); 7947c9fbaeSopenharmony_ci return; 8047c9fbaeSopenharmony_ci } 8147c9fbaeSopenharmony_ci 8247c9fbaeSopenharmony_ci (void)memset_s(info, sizeof(*info), 0, sizeof(*info)); 8347c9fbaeSopenharmony_ci if (strncpy_s(info->event, sizeof(info->event), event, 8447c9fbaeSopenharmony_ci Min(strlen(event), sizeof(info->event) - 1)) != EOK) { 8547c9fbaeSopenharmony_ci BBOX_PRINT_ERR("strncpy_s failed or the info->event is not enough!\n"); 8647c9fbaeSopenharmony_ci } 8747c9fbaeSopenharmony_ci if (strncpy_s(info->module, sizeof(info->module), module, 8847c9fbaeSopenharmony_ci Min(strlen(module), sizeof(info->module) - 1)) != EOK) { 8947c9fbaeSopenharmony_ci BBOX_PRINT_ERR("strncpy_s failed or the info->module is not enough!\n"); 9047c9fbaeSopenharmony_ci } 9147c9fbaeSopenharmony_ci if (strncpy_s(info->errorDesc, sizeof(info->errorDesc), errorDesc, 9247c9fbaeSopenharmony_ci Min(strlen(errorDesc), sizeof(info->errorDesc) - 1)) != EOK) { 9347c9fbaeSopenharmony_ci BBOX_PRINT_ERR("strncpy_s failed or the info->errorDesc is not enough!\n"); 9447c9fbaeSopenharmony_ci } 9547c9fbaeSopenharmony_ci} 9647c9fbaeSopenharmony_ci 9747c9fbaeSopenharmony_cistatic void WaitForLogRootDir(const char *rootDir) 9847c9fbaeSopenharmony_ci{ 9947c9fbaeSopenharmony_ci int i = 0; 10047c9fbaeSopenharmony_ci 10147c9fbaeSopenharmony_ci if (rootDir == NULL) { 10247c9fbaeSopenharmony_ci BBOX_PRINT_ERR("rootDir: %p\n", rootDir); 10347c9fbaeSopenharmony_ci return; 10447c9fbaeSopenharmony_ci } 10547c9fbaeSopenharmony_ci BBOX_PRINT_INFO("wait for log root dir [%s] begin!\n", rootDir); 10647c9fbaeSopenharmony_ci while (i++ < LOG_ROOT_DIR_WAIT_COUNT) { 10747c9fbaeSopenharmony_ci LOS_Msleep(LOG_ROOT_DIR_WAIT_TIME); 10847c9fbaeSopenharmony_ci } 10947c9fbaeSopenharmony_ci BBOX_PRINT_INFO("wait for log root dir [%s] end!\n", rootDir); 11047c9fbaeSopenharmony_ci} 11147c9fbaeSopenharmony_ci 11247c9fbaeSopenharmony_cistatic void SaveBasicErrorInfo(const char *filePath, struct ErrorInfo *info) 11347c9fbaeSopenharmony_ci{ 11447c9fbaeSopenharmony_ci char *buf = NULL; 11547c9fbaeSopenharmony_ci 11647c9fbaeSopenharmony_ci if (filePath == NULL || info == NULL) { 11747c9fbaeSopenharmony_ci BBOX_PRINT_ERR("filePath: %p, info: %p!\n", filePath, info); 11847c9fbaeSopenharmony_ci return; 11947c9fbaeSopenharmony_ci } 12047c9fbaeSopenharmony_ci 12147c9fbaeSopenharmony_ci buf = malloc(ERROR_INFO_MAX_LEN); 12247c9fbaeSopenharmony_ci if (buf == NULL) { 12347c9fbaeSopenharmony_ci BBOX_PRINT_ERR("malloc failed!\n"); 12447c9fbaeSopenharmony_ci return; 12547c9fbaeSopenharmony_ci } 12647c9fbaeSopenharmony_ci (void)memset_s(buf, ERROR_INFO_MAX_LEN, 0, ERROR_INFO_MAX_LEN); 12747c9fbaeSopenharmony_ci if (snprintf_s(buf, ERROR_INFO_MAX_LEN, ERROR_INFO_MAX_LEN - 1, 12847c9fbaeSopenharmony_ci ERROR_INFO_HEADER ERROR_INFO_HEADER_FORMAT, 12947c9fbaeSopenharmony_ci info->event, info->module, info->errorDesc) != -1) { 13047c9fbaeSopenharmony_ci *(buf + ERROR_INFO_MAX_LEN - 1) = '\0'; 13147c9fbaeSopenharmony_ci (void)FullWriteFile(filePath, buf, strlen(buf), 0); 13247c9fbaeSopenharmony_ci } else { 13347c9fbaeSopenharmony_ci PRINT_ERR("buf is not enough or snprintf_s failed\n"); 13447c9fbaeSopenharmony_ci } 13547c9fbaeSopenharmony_ci free(buf); 13647c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] starts uploading event [%s]\n", 13747c9fbaeSopenharmony_ci info->module, info->event); 13847c9fbaeSopenharmony_ci (void)UploadEventByFile(filePath); 13947c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] ends uploading event [%s]\n", 14047c9fbaeSopenharmony_ci info->module, info->event); 14147c9fbaeSopenharmony_ci} 14247c9fbaeSopenharmony_ci 14347c9fbaeSopenharmony_cistatic void* SaveErrorLog(void *param) 14447c9fbaeSopenharmony_ci{ 14547c9fbaeSopenharmony_ci (void)param; 14647c9fbaeSopenharmony_ci struct ErrorInfo *info = NULL; 14747c9fbaeSopenharmony_ci struct BBoxOps *ops = NULL; 14847c9fbaeSopenharmony_ci char dirName[PATH_MAX_LEN] = { 0 }; 14947c9fbaeSopenharmony_ci 15047c9fbaeSopenharmony_ci info = malloc(sizeof(*info)); 15147c9fbaeSopenharmony_ci if (info == NULL) { 15247c9fbaeSopenharmony_ci BBOX_PRINT_ERR("malloc failed!\n"); 15347c9fbaeSopenharmony_ci return NULL; 15447c9fbaeSopenharmony_ci } 15547c9fbaeSopenharmony_ci 15647c9fbaeSopenharmony_ci GetDirName(dirName, sizeof(dirName), GetFaultLogPath()); 15747c9fbaeSopenharmony_ci WaitForLogRootDir(dirName); 15847c9fbaeSopenharmony_ci if (LOS_SemPend(g_opsListSem, LOS_WAIT_FOREVER) != 0) { 15947c9fbaeSopenharmony_ci BBOX_PRINT_ERR("Request g_opsListSem failed!\n"); 16047c9fbaeSopenharmony_ci free(info); 16147c9fbaeSopenharmony_ci return NULL; 16247c9fbaeSopenharmony_ci } 16347c9fbaeSopenharmony_ci UTILS_DL_LIST_FOR_EACH_ENTRY(ops, &g_opsList, struct BBoxOps, opsList) { 16447c9fbaeSopenharmony_ci if (ops == NULL) { 16547c9fbaeSopenharmony_ci continue; 16647c9fbaeSopenharmony_ci } 16747c9fbaeSopenharmony_ci if (ops->ops.GetLastLogInfo != NULL && ops->ops.SaveLastLog != NULL) { 16847c9fbaeSopenharmony_ci (void)memset_s(info, sizeof(*info), 0, sizeof(*info)); 16947c9fbaeSopenharmony_ci if (ops->ops.GetLastLogInfo(info) != 0) { 17047c9fbaeSopenharmony_ci BBOX_PRINT_ERR("[%s] failed to get log info!\n", 17147c9fbaeSopenharmony_ci ops->ops.module); 17247c9fbaeSopenharmony_ci continue; 17347c9fbaeSopenharmony_ci } 17447c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] starts saving log!\n", ops->ops.module); 17547c9fbaeSopenharmony_ci if (ops->ops.SaveLastLog(dirName, info) != 0) { 17647c9fbaeSopenharmony_ci BBOX_PRINT_ERR("[%s] failed to save log!\n", ops->ops.module); 17747c9fbaeSopenharmony_ci } else { 17847c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] ends saving log!\n", ops->ops.module); 17947c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] starts uploading event [%s]\n", info->module, info->event); 18047c9fbaeSopenharmony_ci (void)UploadEventByFile(GetFaultLogPath()); 18147c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] ends uploading event [%s]\n", info->module, info->event); 18247c9fbaeSopenharmony_ci } 18347c9fbaeSopenharmony_ci } 18447c9fbaeSopenharmony_ci } 18547c9fbaeSopenharmony_ci (void)LOS_SemPost(g_opsListSem); 18647c9fbaeSopenharmony_ci free(info); 18747c9fbaeSopenharmony_ci 18847c9fbaeSopenharmony_ci return NULL; 18947c9fbaeSopenharmony_ci} 19047c9fbaeSopenharmony_ci 19147c9fbaeSopenharmony_ci#ifdef BLACKBOX_DEBUG 19247c9fbaeSopenharmony_cistatic void PrintModuleOps(void) 19347c9fbaeSopenharmony_ci{ 19447c9fbaeSopenharmony_ci struct BBoxOps *temp = NULL; 19547c9fbaeSopenharmony_ci 19647c9fbaeSopenharmony_ci BBOX_PRINT_INFO("The following modules have been registered!\n"); 19747c9fbaeSopenharmony_ci UTILS_DL_LIST_FOR_EACH_ENTRY(temp, &g_opsList, struct BBoxOps, opsList) { 19847c9fbaeSopenharmony_ci BBOX_PRINT_INFO("module: %s, Dump: %p, Reset: %p, " 19947c9fbaeSopenharmony_ci "GetLastLogInfo: %p, SaveLastLog: %p\n", 20047c9fbaeSopenharmony_ci temp->ops.module, temp->ops.Dump, temp->ops.Reset, 20147c9fbaeSopenharmony_ci temp->ops.GetLastLogInfo, temp->ops.SaveLastLog); 20247c9fbaeSopenharmony_ci } 20347c9fbaeSopenharmony_ci} 20447c9fbaeSopenharmony_ci#endif 20547c9fbaeSopenharmony_ci 20647c9fbaeSopenharmony_ciint BBoxRegisterModuleOps(struct ModuleOps *ops) 20747c9fbaeSopenharmony_ci{ 20847c9fbaeSopenharmony_ci struct BBoxOps *newOps = NULL; 20947c9fbaeSopenharmony_ci struct BBoxOps *temp = NULL; 21047c9fbaeSopenharmony_ci 21147c9fbaeSopenharmony_ci if (ops == NULL) { 21247c9fbaeSopenharmony_ci BBOX_PRINT_ERR("ops: %p!\n", ops); 21347c9fbaeSopenharmony_ci return -1; 21447c9fbaeSopenharmony_ci } 21547c9fbaeSopenharmony_ci 21647c9fbaeSopenharmony_ci /* Use malloc to avoid the stack overflow */ 21747c9fbaeSopenharmony_ci newOps = malloc(sizeof(*newOps)); 21847c9fbaeSopenharmony_ci if (newOps == NULL) { 21947c9fbaeSopenharmony_ci BBOX_PRINT_ERR("malloc failed!\n"); 22047c9fbaeSopenharmony_ci return -1; 22147c9fbaeSopenharmony_ci } 22247c9fbaeSopenharmony_ci (void)memset_s(newOps, sizeof(*newOps), 0, sizeof(*newOps)); 22347c9fbaeSopenharmony_ci (void)memcpy_s(&newOps->ops, sizeof(newOps->ops), ops, sizeof(*ops)); 22447c9fbaeSopenharmony_ci if (LOS_SemPend(g_opsListSem, LOS_WAIT_FOREVER) != 0) { 22547c9fbaeSopenharmony_ci BBOX_PRINT_ERR("Request g_opsListSem failed!\n"); 22647c9fbaeSopenharmony_ci free(newOps); 22747c9fbaeSopenharmony_ci return -1; 22847c9fbaeSopenharmony_ci } 22947c9fbaeSopenharmony_ci if (UtilsListEmpty(&g_opsList)) { 23047c9fbaeSopenharmony_ci goto __out; 23147c9fbaeSopenharmony_ci } 23247c9fbaeSopenharmony_ci UTILS_DL_LIST_FOR_EACH_ENTRY(temp, &g_opsList, struct BBoxOps, opsList) { 23347c9fbaeSopenharmony_ci if (strcmp(temp->ops.module, ops->module) == 0) { 23447c9fbaeSopenharmony_ci BBOX_PRINT_ERR("[%s] has been registered!\n", ops->module); 23547c9fbaeSopenharmony_ci (void)LOS_SemPost(g_opsListSem); 23647c9fbaeSopenharmony_ci free(newOps); 23747c9fbaeSopenharmony_ci return -1; 23847c9fbaeSopenharmony_ci } 23947c9fbaeSopenharmony_ci } 24047c9fbaeSopenharmony_ci 24147c9fbaeSopenharmony_ci__out: 24247c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] is registered successfully!\n", ops->module); 24347c9fbaeSopenharmony_ci UtilsListTailInsert(&g_opsList, &newOps->opsList); 24447c9fbaeSopenharmony_ci (void)LOS_SemPost(g_opsListSem); 24547c9fbaeSopenharmony_ci#ifdef BLACKBOX_DEBUG 24647c9fbaeSopenharmony_ci PrintModuleOps(); 24747c9fbaeSopenharmony_ci#endif 24847c9fbaeSopenharmony_ci 24947c9fbaeSopenharmony_ci return 0; 25047c9fbaeSopenharmony_ci} 25147c9fbaeSopenharmony_ci 25247c9fbaeSopenharmony_ciint BBoxNotifyError(const char event[EVENT_MAX_LEN], 25347c9fbaeSopenharmony_ci const char module[MODULE_MAX_LEN], 25447c9fbaeSopenharmony_ci const char errorDesc[ERROR_DESC_MAX_LEN], 25547c9fbaeSopenharmony_ci int needSysReset) 25647c9fbaeSopenharmony_ci{ 25747c9fbaeSopenharmony_ci int findModule = 0; 25847c9fbaeSopenharmony_ci struct BBoxOps *ops = NULL; 25947c9fbaeSopenharmony_ci struct ErrorInfo *info = NULL; 26047c9fbaeSopenharmony_ci char dirName[PATH_MAX_LEN] = { 0 }; 26147c9fbaeSopenharmony_ci 26247c9fbaeSopenharmony_ci info = malloc(sizeof(*info)); 26347c9fbaeSopenharmony_ci if (info == NULL) { 26447c9fbaeSopenharmony_ci BBOX_PRINT_ERR("malloc failed!\n"); 26547c9fbaeSopenharmony_ci return -1; 26647c9fbaeSopenharmony_ci } 26747c9fbaeSopenharmony_ci 26847c9fbaeSopenharmony_ci GetDirName(dirName, sizeof(dirName), GetFaultLogPath()); 26947c9fbaeSopenharmony_ci if (needSysReset == 0) { 27047c9fbaeSopenharmony_ci WaitForLogRootDir(dirName); 27147c9fbaeSopenharmony_ci if (LOS_SemPend(g_opsListSem, LOS_NO_WAIT) != 0) { 27247c9fbaeSopenharmony_ci BBOX_PRINT_ERR("Request g_opsListSem failed!\n"); 27347c9fbaeSopenharmony_ci goto __out; 27447c9fbaeSopenharmony_ci } 27547c9fbaeSopenharmony_ci } 27647c9fbaeSopenharmony_ci 27747c9fbaeSopenharmony_ci UTILS_DL_LIST_FOR_EACH_ENTRY(ops, &g_opsList, struct BBoxOps, opsList) { 27847c9fbaeSopenharmony_ci if (ops == NULL) { 27947c9fbaeSopenharmony_ci BBOX_PRINT_ERR("ops: %p!\n", ops); 28047c9fbaeSopenharmony_ci continue; 28147c9fbaeSopenharmony_ci } 28247c9fbaeSopenharmony_ci if (strcmp(ops->ops.module, module) != 0) { 28347c9fbaeSopenharmony_ci continue; 28447c9fbaeSopenharmony_ci } 28547c9fbaeSopenharmony_ci FormatErrorInfo(info, event, module, errorDesc); 28647c9fbaeSopenharmony_ci if (ops->ops.Dump == NULL && ops->ops.Reset == NULL) { 28747c9fbaeSopenharmony_ci SaveBasicErrorInfo(GetFaultLogPath(), info); 28847c9fbaeSopenharmony_ci break; 28947c9fbaeSopenharmony_ci } 29047c9fbaeSopenharmony_ci if (ops->ops.Dump != NULL) { 29147c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] starts dumping data!\n", ops->ops.module); 29247c9fbaeSopenharmony_ci ops->ops.Dump(dirName, info); 29347c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] ends dumping data!\n", ops->ops.module); 29447c9fbaeSopenharmony_ci } 29547c9fbaeSopenharmony_ci if (ops->ops.Reset != NULL) { 29647c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] starts resetting!\n", ops->ops.module); 29747c9fbaeSopenharmony_ci ops->ops.Reset(info); 29847c9fbaeSopenharmony_ci BBOX_PRINT_INFO("[%s] ends resetting!\n", ops->ops.module); 29947c9fbaeSopenharmony_ci } 30047c9fbaeSopenharmony_ci findModule = 1; 30147c9fbaeSopenharmony_ci break; 30247c9fbaeSopenharmony_ci } 30347c9fbaeSopenharmony_ci if (needSysReset == 0) { 30447c9fbaeSopenharmony_ci (void)LOS_SemPost(g_opsListSem); 30547c9fbaeSopenharmony_ci } 30647c9fbaeSopenharmony_ci 30747c9fbaeSopenharmony_ci__out: 30847c9fbaeSopenharmony_ci if (info != NULL) { 30947c9fbaeSopenharmony_ci free(info); 31047c9fbaeSopenharmony_ci } 31147c9fbaeSopenharmony_ci if (needSysReset != 0 && findModule != 0) { 31247c9fbaeSopenharmony_ci RebootSystem(); 31347c9fbaeSopenharmony_ci } 31447c9fbaeSopenharmony_ci 31547c9fbaeSopenharmony_ci return 0; 31647c9fbaeSopenharmony_ci} 31747c9fbaeSopenharmony_ci 31847c9fbaeSopenharmony_cistatic void BBoxInit(void) 31947c9fbaeSopenharmony_ci{ 32047c9fbaeSopenharmony_ci int ret = -1; 32147c9fbaeSopenharmony_ci pthread_t taskId = 0; 32247c9fbaeSopenharmony_ci 32347c9fbaeSopenharmony_ci if (LOS_BinarySemCreate(1, &g_opsListSem) != LOS_OK) { 32447c9fbaeSopenharmony_ci BBOX_PRINT_ERR("Create binary semaphore failed!\n"); 32547c9fbaeSopenharmony_ci return; 32647c9fbaeSopenharmony_ci } 32747c9fbaeSopenharmony_ci UtilsListInit(&g_opsList); 32847c9fbaeSopenharmony_ci ret = pthread_create(&taskId, NULL, SaveErrorLog, NULL); 32947c9fbaeSopenharmony_ci if (ret != 0) { 33047c9fbaeSopenharmony_ci BBOX_PRINT_ERR("Falied to create SaveErrorLog task, ret: %d\n", ret); 33147c9fbaeSopenharmony_ci } 33247c9fbaeSopenharmony_ci} 33347c9fbaeSopenharmony_ciCORE_INIT_PRI(BBoxInit, 1);