148f512ceSopenharmony_ci/*
248f512ceSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
348f512ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
448f512ceSopenharmony_ci * you may not use this file except in compliance with the License.
548f512ceSopenharmony_ci * You may obtain a copy of the License at
648f512ceSopenharmony_ci *
748f512ceSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
848f512ceSopenharmony_ci *
948f512ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1048f512ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1148f512ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1248f512ceSopenharmony_ci * See the License for the specific language governing permissions and
1348f512ceSopenharmony_ci * limitations under the License.
1448f512ceSopenharmony_ci */
1548f512ceSopenharmony_ci
1648f512ceSopenharmony_ci#ifndef HIPERF_HILOG
1748f512ceSopenharmony_ci#define HIPERF_HILOG
1848f512ceSopenharmony_ci
1948f512ceSopenharmony_ci#include <securec.h>
2048f512ceSopenharmony_ci#include <stdarg.h>
2148f512ceSopenharmony_ci
2248f512ceSopenharmony_ci#ifndef CONFIG_NO_HILOG
2348f512ceSopenharmony_ci#define HILOG_PUBLIC  "{public}"
2448f512ceSopenharmony_ci#define HILOG_NEWLINE ""
2548f512ceSopenharmony_ci#else
2648f512ceSopenharmony_ci#define HILOG_PUBLIC  ""
2748f512ceSopenharmony_ci#define HILOG_NEWLINE "\n"
2848f512ceSopenharmony_ci#endif
2948f512ceSopenharmony_ci
3048f512ceSopenharmony_ci#ifdef IS_RELEASE_VERSION
3148f512ceSopenharmony_ci#define FORMATTED(fmt, ...) "[%" HILOG_PUBLIC "s]" fmt HILOG_NEWLINE, __FUNCTION__, ##__VA_ARGS__
3248f512ceSopenharmony_ci#else
3348f512ceSopenharmony_ci#define FORMATTED(fmt, ...)                                                                             \
3448f512ceSopenharmony_ci    "[%" HILOG_PUBLIC "s:%" HILOG_PUBLIC "d] %" HILOG_PUBLIC "s# " fmt HILOG_NEWLINE, __FILE_NAME__,    \
3548f512ceSopenharmony_ci        __LINE__, __FUNCTION__, ##__VA_ARGS__
3648f512ceSopenharmony_ci#endif
3748f512ceSopenharmony_ci
3848f512ceSopenharmony_ci#ifndef CONFIG_NO_HILOG
3948f512ceSopenharmony_ci#include "hilog/log.h"
4048f512ceSopenharmony_ci
4148f512ceSopenharmony_ci#ifdef HIPERF_HILOGF
4248f512ceSopenharmony_ci#undef HIPERF_HILOGF
4348f512ceSopenharmony_ci#endif
4448f512ceSopenharmony_ci
4548f512ceSopenharmony_ci#ifdef HIPERF_HILOGE
4648f512ceSopenharmony_ci#undef HIPERF_HILOGE
4748f512ceSopenharmony_ci#endif
4848f512ceSopenharmony_ci
4948f512ceSopenharmony_ci#ifdef HIPERF_HILOGW
5048f512ceSopenharmony_ci#undef HIPERF_HILOGW
5148f512ceSopenharmony_ci#endif
5248f512ceSopenharmony_ci
5348f512ceSopenharmony_ci#ifdef HIPERF_HILOGI
5448f512ceSopenharmony_ci#undef HIPERF_HILOGI
5548f512ceSopenharmony_ci#endif
5648f512ceSopenharmony_ci
5748f512ceSopenharmony_ci#ifdef HIPERF_HILOGD
5848f512ceSopenharmony_ci#undef HIPERF_HILOGD
5948f512ceSopenharmony_ci#endif
6048f512ceSopenharmony_ci
6148f512ceSopenharmony_ci// param of log interface, such as HIPERF_HILOGF.
6248f512ceSopenharmony_cienum HiperfModule {
6348f512ceSopenharmony_ci    MODULE_DEFAULT = 0,
6448f512ceSopenharmony_ci    MODULE_JS_NAPI,
6548f512ceSopenharmony_ci    MODULE_CPP_API,
6648f512ceSopenharmony_ci};
6748f512ceSopenharmony_ci
6848f512ceSopenharmony_cistatic constexpr unsigned int BASE_HIPERF_DOMAIN_ID = 0xD002D0D;
6948f512ceSopenharmony_cistatic constexpr OHOS::HiviewDFX::HiLogLabel HIPERF_HILOG_LABLE[] = {
7048f512ceSopenharmony_ci    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "hiperf"},
7148f512ceSopenharmony_ci    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "HiperfJSNAPI"},
7248f512ceSopenharmony_ci    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "HiperfCPPAPI"},
7348f512ceSopenharmony_ci};
7448f512ceSopenharmony_ci
7548f512ceSopenharmony_ci#ifdef LOG_DOMAIN
7648f512ceSopenharmony_ci#undef LOG_DOMAIN
7748f512ceSopenharmony_ci#endif
7848f512ceSopenharmony_ci#define LOG_DOMAIN 0xD002D0D
7948f512ceSopenharmony_ci
8048f512ceSopenharmony_ci#ifdef LOG_TAG
8148f512ceSopenharmony_ci#undef LOG_TAG
8248f512ceSopenharmony_ci#endif
8348f512ceSopenharmony_ci#define LOG_TAG "hiperf"
8448f512ceSopenharmony_ci
8548f512ceSopenharmony_ci// In order to improve performance, do not check the module range
8648f512ceSopenharmony_ci
8748f512ceSopenharmony_ci#define HIPERF_HILOGF(module, ...)                                                                 \
8848f512ceSopenharmony_ci    HILOG_FATAL(LOG_CORE, __VA_ARGS__)
8948f512ceSopenharmony_ci#define HIPERF_HILOGE(module, ...)                                                                 \
9048f512ceSopenharmony_ci    HILOG_ERROR(LOG_CORE, __VA_ARGS__)
9148f512ceSopenharmony_ci#define HIPERF_HILOGW(module, ...)                                                                 \
9248f512ceSopenharmony_ci    HILOG_WARN(LOG_CORE, __VA_ARGS__)
9348f512ceSopenharmony_ci#define HIPERF_HILOGI(module, ...)                                                                 \
9448f512ceSopenharmony_ci    HILOG_INFO(LOG_CORE, __VA_ARGS__)
9548f512ceSopenharmony_ci#define HIPERF_HILOGD(module, ...)                                                                 \
9648f512ceSopenharmony_ci    HILOG_DEBUG(LOG_CORE, __VA_ARGS__)
9748f512ceSopenharmony_ci#else
9848f512ceSopenharmony_ci
9948f512ceSopenharmony_ci#define HIPERF_HILOGF(module, ...) printf(FORMATTED(__VA_ARGS__))
10048f512ceSopenharmony_ci#define HIPERF_HILOGE(module, ...) printf(FORMATTED(__VA_ARGS__))
10148f512ceSopenharmony_ci#define HIPERF_HILOGW(module, ...) printf(FORMATTED(__VA_ARGS__))
10248f512ceSopenharmony_ci#define HIPERF_HILOGI(module, ...) printf(FORMATTED(__VA_ARGS__))
10348f512ceSopenharmony_ci#define HIPERF_HILOGD(module, ...) printf(FORMATTED(__VA_ARGS__))
10448f512ceSopenharmony_ci
10548f512ceSopenharmony_ci#endif // CONFIG_NO_HILOG
10648f512ceSopenharmony_ci
10748f512ceSopenharmony_cistatic inline std::string StringFormat(const char* fmt, ...)
10848f512ceSopenharmony_ci{
10948f512ceSopenharmony_ci    va_list vargs;
11048f512ceSopenharmony_ci    char buf[1024] = {0}; // 1024: buf size
11148f512ceSopenharmony_ci    std::string format(fmt);
11248f512ceSopenharmony_ci    va_start(vargs, fmt);
11348f512ceSopenharmony_ci    if (vsnprintf_s(buf, sizeof(buf), sizeof(buf) - 1, format.c_str(), vargs) < 0) {
11448f512ceSopenharmony_ci        va_end(vargs);
11548f512ceSopenharmony_ci        return "";
11648f512ceSopenharmony_ci    }
11748f512ceSopenharmony_ci
11848f512ceSopenharmony_ci    va_end(vargs);
11948f512ceSopenharmony_ci    return buf;
12048f512ceSopenharmony_ci}
12148f512ceSopenharmony_ci
12248f512ceSopenharmony_ci#define NO_RETVAL /* retval */
12348f512ceSopenharmony_ci#define LOG_TYPE_PRINTF 2
12448f512ceSopenharmony_ci#define LOG_TYPE_WITH_HILOG 3
12548f512ceSopenharmony_ci#define CHECK_TRUE(expr, retval, log, fmt, ...)                                                    \
12648f512ceSopenharmony_ci    do {                                                                                           \
12748f512ceSopenharmony_ci        if (expr) {                                                                                \
12848f512ceSopenharmony_ci            if (log == 1) {                                                                        \
12948f512ceSopenharmony_ci                std::string str = StringFormat(fmt, ##__VA_ARGS__);                                \
13048f512ceSopenharmony_ci                HLOGE("%s", str.c_str());                                                          \
13148f512ceSopenharmony_ci            } else if (log == LOG_TYPE_PRINTF) {                                                   \
13248f512ceSopenharmony_ci                printf("%s", StringFormat(fmt, ##__VA_ARGS__).c_str());                            \
13348f512ceSopenharmony_ci            } else if (log == LOG_TYPE_WITH_HILOG) {                                               \
13448f512ceSopenharmony_ci                std::string str = StringFormat(fmt, ##__VA_ARGS__);                                \
13548f512ceSopenharmony_ci                HLOGE("%s", str.c_str());                                                          \
13648f512ceSopenharmony_ci                HIPERF_HILOGE(MODULE_DEFAULT, "%s", str.c_str());                                  \
13748f512ceSopenharmony_ci            }                                                                                      \
13848f512ceSopenharmony_ci            return retval;                                                                         \
13948f512ceSopenharmony_ci        }                                                                                          \
14048f512ceSopenharmony_ci    } while (0)
14148f512ceSopenharmony_ci
14248f512ceSopenharmony_ci#endif // HIPERF_HILOG
143