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