1/*
2 * Copyright (c) 2021 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
16#ifndef HIPERF_HILOG
17#define HIPERF_HILOG
18
19#include <securec.h>
20#include <stdarg.h>
21
22#ifndef CONFIG_NO_HILOG
23#define HILOG_PUBLIC  "{public}"
24#define HILOG_NEWLINE ""
25#else
26#define HILOG_PUBLIC  ""
27#define HILOG_NEWLINE "\n"
28#endif
29
30#ifdef IS_RELEASE_VERSION
31#define FORMATTED(fmt, ...) "[%" HILOG_PUBLIC "s]" fmt HILOG_NEWLINE, __FUNCTION__, ##__VA_ARGS__
32#else
33#define FORMATTED(fmt, ...)                                                                             \
34    "[%" HILOG_PUBLIC "s:%" HILOG_PUBLIC "d] %" HILOG_PUBLIC "s# " fmt HILOG_NEWLINE, __FILE_NAME__,    \
35        __LINE__, __FUNCTION__, ##__VA_ARGS__
36#endif
37
38#ifndef CONFIG_NO_HILOG
39#include "hilog/log.h"
40
41#ifdef HIPERF_HILOGF
42#undef HIPERF_HILOGF
43#endif
44
45#ifdef HIPERF_HILOGE
46#undef HIPERF_HILOGE
47#endif
48
49#ifdef HIPERF_HILOGW
50#undef HIPERF_HILOGW
51#endif
52
53#ifdef HIPERF_HILOGI
54#undef HIPERF_HILOGI
55#endif
56
57#ifdef HIPERF_HILOGD
58#undef HIPERF_HILOGD
59#endif
60
61// param of log interface, such as HIPERF_HILOGF.
62enum HiperfModule {
63    MODULE_DEFAULT = 0,
64    MODULE_JS_NAPI,
65    MODULE_CPP_API,
66};
67
68static constexpr unsigned int BASE_HIPERF_DOMAIN_ID = 0xD002D0D;
69static constexpr OHOS::HiviewDFX::HiLogLabel HIPERF_HILOG_LABLE[] = {
70    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "hiperf"},
71    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "HiperfJSNAPI"},
72    {LOG_CORE, BASE_HIPERF_DOMAIN_ID, "HiperfCPPAPI"},
73};
74
75#ifdef LOG_DOMAIN
76#undef LOG_DOMAIN
77#endif
78#define LOG_DOMAIN 0xD002D0D
79
80#ifdef LOG_TAG
81#undef LOG_TAG
82#endif
83#define LOG_TAG "hiperf"
84
85// In order to improve performance, do not check the module range
86
87#define HIPERF_HILOGF(module, ...)                                                                 \
88    HILOG_FATAL(LOG_CORE, __VA_ARGS__)
89#define HIPERF_HILOGE(module, ...)                                                                 \
90    HILOG_ERROR(LOG_CORE, __VA_ARGS__)
91#define HIPERF_HILOGW(module, ...)                                                                 \
92    HILOG_WARN(LOG_CORE, __VA_ARGS__)
93#define HIPERF_HILOGI(module, ...)                                                                 \
94    HILOG_INFO(LOG_CORE, __VA_ARGS__)
95#define HIPERF_HILOGD(module, ...)                                                                 \
96    HILOG_DEBUG(LOG_CORE, __VA_ARGS__)
97#else
98
99#define HIPERF_HILOGF(module, ...) printf(FORMATTED(__VA_ARGS__))
100#define HIPERF_HILOGE(module, ...) printf(FORMATTED(__VA_ARGS__))
101#define HIPERF_HILOGW(module, ...) printf(FORMATTED(__VA_ARGS__))
102#define HIPERF_HILOGI(module, ...) printf(FORMATTED(__VA_ARGS__))
103#define HIPERF_HILOGD(module, ...) printf(FORMATTED(__VA_ARGS__))
104
105#endif // CONFIG_NO_HILOG
106
107static inline std::string StringFormat(const char* fmt, ...)
108{
109    va_list vargs;
110    char buf[1024] = {0}; // 1024: buf size
111    std::string format(fmt);
112    va_start(vargs, fmt);
113    if (vsnprintf_s(buf, sizeof(buf), sizeof(buf) - 1, format.c_str(), vargs) < 0) {
114        va_end(vargs);
115        return "";
116    }
117
118    va_end(vargs);
119    return buf;
120}
121
122#define NO_RETVAL /* retval */
123#define LOG_TYPE_PRINTF 2
124#define LOG_TYPE_WITH_HILOG 3
125#define CHECK_TRUE(expr, retval, log, fmt, ...)                                                    \
126    do {                                                                                           \
127        if (expr) {                                                                                \
128            if (log == 1) {                                                                        \
129                std::string str = StringFormat(fmt, ##__VA_ARGS__);                                \
130                HLOGE("%s", str.c_str());                                                          \
131            } else if (log == LOG_TYPE_PRINTF) {                                                   \
132                printf("%s", StringFormat(fmt, ##__VA_ARGS__).c_str());                            \
133            } else if (log == LOG_TYPE_WITH_HILOG) {                                               \
134                std::string str = StringFormat(fmt, ##__VA_ARGS__);                                \
135                HLOGE("%s", str.c_str());                                                          \
136                HIPERF_HILOGE(MODULE_DEFAULT, "%s", str.c_str());                                  \
137            }                                                                                      \
138            return retval;                                                                         \
139        }                                                                                          \
140    } while (0)
141
142#endif // HIPERF_HILOG
143