1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 5484543d1Sopenharmony_ci * You may obtain a copy of the License at 6484543d1Sopenharmony_ci * 7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 13484543d1Sopenharmony_ci * limitations under the License. 14484543d1Sopenharmony_ci */ 15484543d1Sopenharmony_ci 16484543d1Sopenharmony_ci#ifndef __FFRT_LOG_API_H__ 17484543d1Sopenharmony_ci#define __FFRT_LOG_API_H__ 18484543d1Sopenharmony_ci 19484543d1Sopenharmony_ci#ifdef OHOS_STANDARD_SYSTEM 20484543d1Sopenharmony_ci#include <array> 21484543d1Sopenharmony_ci#ifdef FFRT_ENG_DEBUG 22484543d1Sopenharmony_ci#include <info/fatal_message.h> 23484543d1Sopenharmony_ci#endif 24484543d1Sopenharmony_ci#include <string_view> 25484543d1Sopenharmony_ci#include "hilog/log.h" 26484543d1Sopenharmony_ci#include "dfx/bbox/fault_logger_fd_manager.h" 27484543d1Sopenharmony_ci#else 28484543d1Sopenharmony_ci#include "log_base.h" 29484543d1Sopenharmony_ci#endif 30484543d1Sopenharmony_ci 31484543d1Sopenharmony_ci#define FFRT_LOG_ERROR (0) 32484543d1Sopenharmony_ci#define FFRT_LOG_WARN (1) 33484543d1Sopenharmony_ci#define FFRT_LOG_INFO (2) 34484543d1Sopenharmony_ci#define FFRT_LOG_DEBUG (3) 35484543d1Sopenharmony_ci#define FFRT_LOG_LEVEL_MAX (FFRT_LOG_DEBUG + 1) 36484543d1Sopenharmony_ci 37484543d1Sopenharmony_ciunsigned int GetLogId(void); 38484543d1Sopenharmony_ci 39484543d1Sopenharmony_ci#ifdef OHOS_STANDARD_SYSTEM 40484543d1Sopenharmony_citemplate<size_t N> 41484543d1Sopenharmony_ciconstexpr auto convertFmtToPublic(const char(&str)[N]) 42484543d1Sopenharmony_ci{ 43484543d1Sopenharmony_ci constexpr std::string_view fmtpub = "{public}"; 44484543d1Sopenharmony_ci std::array<char, (N / 2) * fmtpub.size() + N> res{}; 45484543d1Sopenharmony_ci for (size_t i = 0, j = 0; i < N; ++i) { 46484543d1Sopenharmony_ci res[j++] = str[i]; 47484543d1Sopenharmony_ci if (str[i] != '%') { 48484543d1Sopenharmony_ci continue; 49484543d1Sopenharmony_ci } 50484543d1Sopenharmony_ci 51484543d1Sopenharmony_ci if (str[i + 1] != '%' && str[i + 1] != '{') { 52484543d1Sopenharmony_ci for (size_t k = 0; k < fmtpub.size(); ++k) { 53484543d1Sopenharmony_ci res[j++] = fmtpub[k]; 54484543d1Sopenharmony_ci } 55484543d1Sopenharmony_ci } else { 56484543d1Sopenharmony_ci res[j++] = str[i + 1]; 57484543d1Sopenharmony_ci i += 1; 58484543d1Sopenharmony_ci } 59484543d1Sopenharmony_ci } 60484543d1Sopenharmony_ci 61484543d1Sopenharmony_ci return res; 62484543d1Sopenharmony_ci} 63484543d1Sopenharmony_ci 64484543d1Sopenharmony_ci#ifdef HILOG_FMTID 65484543d1Sopenharmony_ci#define HILOG_IMPL_STD_ARRAY(type, level, fmt, ...) \ 66484543d1Sopenharmony_ci do { \ 67484543d1Sopenharmony_ci constexpr HILOG_FMT_IN_SECTION static auto hilogFmt = fmt; \ 68484543d1Sopenharmony_ci FmtId fmtid{ HILOG_UUID, HILOG_FMT_OFFSET(hilogFmt.data()) }; \ 69484543d1Sopenharmony_ci HiLogPrintDict(type, level, 0xD001719, "ffrt", &fmtid, hilogFmt.data(), ##__VA_ARGS__); \ 70484543d1Sopenharmony_ci } while (0) 71484543d1Sopenharmony_ci#else 72484543d1Sopenharmony_ci#define HILOG_IMPL_STD_ARRAY(type, level, fmt, ...) \ 73484543d1Sopenharmony_ci do { \ 74484543d1Sopenharmony_ci HiLogPrint(type, level, 0xD001719, "ffrt", fmt.data(), ##__VA_ARGS__); \ 75484543d1Sopenharmony_ci } while (0) 76484543d1Sopenharmony_ci#endif 77484543d1Sopenharmony_ci 78484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_DEBUG) 79484543d1Sopenharmony_ci#define FFRT_LOGD(format, ...) \ 80484543d1Sopenharmony_ci do { \ 81484543d1Sopenharmony_ci constexpr auto fmtPub = convertFmtToPublic("%u:%s:%d " format); \ 82484543d1Sopenharmony_ci HILOG_IMPL_STD_ARRAY(LOG_CORE, LOG_DEBUG, fmtPub, GetLogId(), __func__, __LINE__, ##__VA_ARGS__); \ 83484543d1Sopenharmony_ci } while (0) 84484543d1Sopenharmony_ci#else 85484543d1Sopenharmony_ci#define FFRT_LOGD(format, ...) 86484543d1Sopenharmony_ci#endif 87484543d1Sopenharmony_ci 88484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_INFO) 89484543d1Sopenharmony_ci#define FFRT_LOGI(format, ...) \ 90484543d1Sopenharmony_ci do { \ 91484543d1Sopenharmony_ci constexpr auto fmtPub = convertFmtToPublic("%u:%s:%d " format); \ 92484543d1Sopenharmony_ci HILOG_IMPL_STD_ARRAY(LOG_CORE, LOG_INFO, fmtPub, GetLogId(), __func__, __LINE__, ##__VA_ARGS__); \ 93484543d1Sopenharmony_ci } while (0) 94484543d1Sopenharmony_ci#else 95484543d1Sopenharmony_ci#define FFRT_LOGI(format, ...) 96484543d1Sopenharmony_ci#endif 97484543d1Sopenharmony_ci 98484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_WARN) 99484543d1Sopenharmony_ci#define FFRT_LOGW(format, ...) \ 100484543d1Sopenharmony_ci do { \ 101484543d1Sopenharmony_ci constexpr auto fmtPub = convertFmtToPublic("%u:%s:%d " format); \ 102484543d1Sopenharmony_ci HILOG_IMPL_STD_ARRAY(LOG_CORE, LOG_WARN, fmtPub, GetLogId(), __func__, __LINE__, ##__VA_ARGS__); \ 103484543d1Sopenharmony_ci } while (0) 104484543d1Sopenharmony_ci#else 105484543d1Sopenharmony_ci#define FFRT_LOGW(format, ...) 106484543d1Sopenharmony_ci#endif 107484543d1Sopenharmony_ci 108484543d1Sopenharmony_ci#define FFRT_LOGE(format, ...) \ 109484543d1Sopenharmony_ci do { \ 110484543d1Sopenharmony_ci constexpr auto fmtPub = convertFmtToPublic("%u:%s:%d " format); \ 111484543d1Sopenharmony_ci HILOG_IMPL_STD_ARRAY(LOG_CORE, LOG_ERROR, fmtPub, GetLogId(), __func__, __LINE__, ##__VA_ARGS__); \ 112484543d1Sopenharmony_ci } while (0) 113484543d1Sopenharmony_ci#else 114484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_DEBUG) 115484543d1Sopenharmony_ci#define FFRT_LOGD(format, ...) FFRT_LOG(FFRT_LOG_DEBUG, format, ##__VA_ARGS__) 116484543d1Sopenharmony_ci#else 117484543d1Sopenharmony_ci#define FFRT_LOGD(format, ...) 118484543d1Sopenharmony_ci#endif 119484543d1Sopenharmony_ci 120484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_INFO) 121484543d1Sopenharmony_ci#define FFRT_LOGI(format, ...) FFRT_LOG(FFRT_LOG_INFO, format, ##__VA_ARGS__) 122484543d1Sopenharmony_ci#else 123484543d1Sopenharmony_ci#define FFRT_LOGI(format, ...) 124484543d1Sopenharmony_ci#endif 125484543d1Sopenharmony_ci 126484543d1Sopenharmony_ci#if (FFRT_LOG_LEVEL >= FFRT_LOG_WARN) 127484543d1Sopenharmony_ci#define FFRT_LOGW(format, ...) FFRT_LOG(FFRT_LOG_WARN, format, ##__VA_ARGS__) 128484543d1Sopenharmony_ci#else 129484543d1Sopenharmony_ci#define FFRT_LOGW(format, ...) 130484543d1Sopenharmony_ci#endif 131484543d1Sopenharmony_ci 132484543d1Sopenharmony_ci#define FFRT_LOGE(format, ...) FFRT_LOG(FFRT_LOG_ERROR, format, ##__VA_ARGS__) 133484543d1Sopenharmony_ci#endif 134484543d1Sopenharmony_ci 135484543d1Sopenharmony_ci 136484543d1Sopenharmony_ci#ifdef OHOS_STANDARD_SYSTEM 137484543d1Sopenharmony_ci#define FFRT_BBOX_LOG(format, ...) \ 138484543d1Sopenharmony_ci do { \ 139484543d1Sopenharmony_ci FFRT_LOGE(format, ##__VA_ARGS__); \ 140484543d1Sopenharmony_ci FaultLoggerFdManager::Instance().WriteFaultLogger(format, ##__VA_ARGS__); \ 141484543d1Sopenharmony_ci } while (0) 142484543d1Sopenharmony_ci#else 143484543d1Sopenharmony_ci#define FFRT_BBOX_LOG(format, ...) FFRT_LOGE(format, ##__VA_ARGS__) 144484543d1Sopenharmony_ci#endif 145484543d1Sopenharmony_ci 146484543d1Sopenharmony_ci#define FFRT_COND_DO_ERR(cond, expr, format, ...) \ 147484543d1Sopenharmony_ci if (cond) { \ 148484543d1Sopenharmony_ci FFRT_LOGE(format, ##__VA_ARGS__); \ 149484543d1Sopenharmony_ci { \ 150484543d1Sopenharmony_ci expr; \ 151484543d1Sopenharmony_ci } \ 152484543d1Sopenharmony_ci } 153484543d1Sopenharmony_ci 154484543d1Sopenharmony_ci// Do not use this Marco directly 155484543d1Sopenharmony_ci#define COND_RETURN_(COND, ERRCODE, ...) \ 156484543d1Sopenharmony_ci if ((COND)) { \ 157484543d1Sopenharmony_ci FFRT_LOGE(__VA_ARGS__); \ 158484543d1Sopenharmony_ci return ERRCODE; \ 159484543d1Sopenharmony_ci } 160484543d1Sopenharmony_ci 161484543d1Sopenharmony_ci#define FFRT_COND_RETURN_ERROR(COND, ERRCODE, ...) \ 162484543d1Sopenharmony_ci COND_RETURN_((COND), ERRCODE, ##__VA_ARGS__) 163484543d1Sopenharmony_ci 164484543d1Sopenharmony_ci#define FFRT_COND_RETURN_VOID(COND, ...) \ 165484543d1Sopenharmony_ci if ((COND)) { \ 166484543d1Sopenharmony_ci FFRT_LOGE(__VA_ARGS__); \ 167484543d1Sopenharmony_ci return; \ 168484543d1Sopenharmony_ci } 169484543d1Sopenharmony_ci 170484543d1Sopenharmony_ci// Do not use this Marco directly 171484543d1Sopenharmony_ci#define COND_GOTO_WITH_ERRCODE_(COND, LABEL, ERROR, ERRCODE, ...) \ 172484543d1Sopenharmony_ci if ((COND)) { \ 173484543d1Sopenharmony_ci FFRT_LOGE(__VA_ARGS__); \ 174484543d1Sopenharmony_ci ERROR = (ERRCODE); \ 175484543d1Sopenharmony_ci goto LABEL; \ 176484543d1Sopenharmony_ci } 177484543d1Sopenharmony_ci 178484543d1Sopenharmony_ci#define FFRT_COND_GOTO_ERROR(COND, LABEL, ERROR, ERRCODE, ...) \ 179484543d1Sopenharmony_ci COND_GOTO_WITH_ERRCODE_((COND), LABEL, ERROR, ERRCODE, ##__VA_ARGS__) 180484543d1Sopenharmony_ci 181484543d1Sopenharmony_ci#define FFRT_UNUSED(expr) \ 182484543d1Sopenharmony_ci do { \ 183484543d1Sopenharmony_ci (void)(expr); \ 184484543d1Sopenharmony_ci } while (0) 185484543d1Sopenharmony_ci 186484543d1Sopenharmony_ci#ifdef FFRT_ENG_DEBUG 187484543d1Sopenharmony_ci#define FFRT_UNLIKELY_COND_DO_ABORT(cond, fmt, ...) \ 188484543d1Sopenharmony_ci do { \ 189484543d1Sopenharmony_ci if (unlikely(cond)) { \ 190484543d1Sopenharmony_ci char fatal_msg[256]; \ 191484543d1Sopenharmony_ci snprintf_s(fatal_msg, sizeof(fatal_msg), sizeof(fatal_msg) - 1, fmt, ##__VA_ARGS__); \ 192484543d1Sopenharmony_ci FFRT_LOGE(fmt, ##__VA_ARGS__); \ 193484543d1Sopenharmony_ci set_fatal_message(fatal_msg); \ 194484543d1Sopenharmony_ci abort(); \ 195484543d1Sopenharmony_ci } \ 196484543d1Sopenharmony_ci } while (0) 197484543d1Sopenharmony_ci 198484543d1Sopenharmony_ci#else 199484543d1Sopenharmony_ci#define FFRT_UNLIKELY_COND_DO_ABORT(cond, fmt, ...) \ 200484543d1Sopenharmony_ci do { \ 201484543d1Sopenharmony_ci if (unlikely(cond)) { \ 202484543d1Sopenharmony_ci FFRT_LOGE(fmt, ##__VA_ARGS__); \ 203484543d1Sopenharmony_ci } \ 204484543d1Sopenharmony_ci } while (0) 205484543d1Sopenharmony_ci#endif // FFRT_ENG_DEBUG 206484543d1Sopenharmony_ci#endif // __FFRT_LOG_API_H__ 207