123b3eb3cSopenharmony_ci/* 223b3eb3cSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 323b3eb3cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 423b3eb3cSopenharmony_ci * you may not use this file except in compliance with the License. 523b3eb3cSopenharmony_ci * You may obtain a copy of the License at 623b3eb3cSopenharmony_ci * 723b3eb3cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 823b3eb3cSopenharmony_ci * 923b3eb3cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1023b3eb3cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1123b3eb3cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1223b3eb3cSopenharmony_ci * See the License for the specific language governing permissions and 1323b3eb3cSopenharmony_ci * limitations under the License. 1423b3eb3cSopenharmony_ci */ 1523b3eb3cSopenharmony_ci 1623b3eb3cSopenharmony_ci#include "base/log/ace_trace.h" 1723b3eb3cSopenharmony_ci 1823b3eb3cSopenharmony_ci#ifndef WINDOWS_PLATFORM 1923b3eb3cSopenharmony_ci#include "securec.h" 2023b3eb3cSopenharmony_ci#endif 2123b3eb3cSopenharmony_ci 2223b3eb3cSopenharmony_cinamespace OHOS::Ace { 2323b3eb3cSopenharmony_cinamespace { 2423b3eb3cSopenharmony_ciconst size_t MAX_STRING_SIZE = 512; 2523b3eb3cSopenharmony_ci} 2623b3eb3cSopenharmony_ci 2723b3eb3cSopenharmony_cibool AceTraceBeginWithArgv(const char* format, va_list args) 2823b3eb3cSopenharmony_ci{ 2923b3eb3cSopenharmony_ci char name[MAX_STRING_SIZE] = { 0 }; 3023b3eb3cSopenharmony_ci if (vsnprintf_s(name, sizeof(name), sizeof(name) - 1, format, args) < 0) { 3123b3eb3cSopenharmony_ci return false; 3223b3eb3cSopenharmony_ci } 3323b3eb3cSopenharmony_ci AceTraceBegin(name); 3423b3eb3cSopenharmony_ci return true; 3523b3eb3cSopenharmony_ci} 3623b3eb3cSopenharmony_ci 3723b3eb3cSopenharmony_cibool AceTraceBeginWithArgvCommercial(const char* format, va_list args) 3823b3eb3cSopenharmony_ci{ 3923b3eb3cSopenharmony_ci char name[MAX_STRING_SIZE] = { 0 }; 4023b3eb3cSopenharmony_ci if (vsnprintf_s(name, sizeof(name), sizeof(name) - 1, format, args) < 0) { 4123b3eb3cSopenharmony_ci return false; 4223b3eb3cSopenharmony_ci } 4323b3eb3cSopenharmony_ci AceTraceBeginCommercial(name); 4423b3eb3cSopenharmony_ci return true; 4523b3eb3cSopenharmony_ci} 4623b3eb3cSopenharmony_ci 4723b3eb3cSopenharmony_cibool AceTraceBeginWithArgs(const char* format, ...) 4823b3eb3cSopenharmony_ci{ 4923b3eb3cSopenharmony_ci va_list args; 5023b3eb3cSopenharmony_ci va_start(args, format); 5123b3eb3cSopenharmony_ci bool retVal = AceTraceBeginWithArgv(format, args); 5223b3eb3cSopenharmony_ci va_end(args); 5323b3eb3cSopenharmony_ci return retVal; 5423b3eb3cSopenharmony_ci} 5523b3eb3cSopenharmony_ci 5623b3eb3cSopenharmony_civoid AceCountTraceWidthArgs(int32_t count, const char* format, ...) 5723b3eb3cSopenharmony_ci{ 5823b3eb3cSopenharmony_ci char name[MAX_STRING_SIZE] = { 0 }; 5923b3eb3cSopenharmony_ci va_list args; 6023b3eb3cSopenharmony_ci va_start(args, format); 6123b3eb3cSopenharmony_ci if (vsnprintf_s(name, sizeof(name), sizeof(name) - 1, format, args) < 0) { 6223b3eb3cSopenharmony_ci return; 6323b3eb3cSopenharmony_ci } 6423b3eb3cSopenharmony_ci va_end(args); 6523b3eb3cSopenharmony_ci AceCountTrace(name, count); 6623b3eb3cSopenharmony_ci} 6723b3eb3cSopenharmony_ci 6823b3eb3cSopenharmony_ciAceScopedTrace::AceScopedTrace(const char* format, ...) 6923b3eb3cSopenharmony_ci{ 7023b3eb3cSopenharmony_ci va_list args; 7123b3eb3cSopenharmony_ci va_start(args, format); 7223b3eb3cSopenharmony_ci strValid_ = AceTraceBeginWithArgv(format, args); 7323b3eb3cSopenharmony_ci va_end(args); 7423b3eb3cSopenharmony_ci} 7523b3eb3cSopenharmony_ci 7623b3eb3cSopenharmony_ciAceScopedTrace::~AceScopedTrace() 7723b3eb3cSopenharmony_ci{ 7823b3eb3cSopenharmony_ci if (strValid_) { 7923b3eb3cSopenharmony_ci AceTraceEnd(); 8023b3eb3cSopenharmony_ci } 8123b3eb3cSopenharmony_ci} 8223b3eb3cSopenharmony_ci 8323b3eb3cSopenharmony_ciAceScopedTraceCommercial::AceScopedTraceCommercial(const char* format, ...) 8423b3eb3cSopenharmony_ci{ 8523b3eb3cSopenharmony_ci va_list args; 8623b3eb3cSopenharmony_ci va_start(args, format); 8723b3eb3cSopenharmony_ci strValid_ = AceTraceBeginWithArgvCommercial(format, args); 8823b3eb3cSopenharmony_ci va_end(args); 8923b3eb3cSopenharmony_ci} 9023b3eb3cSopenharmony_ci 9123b3eb3cSopenharmony_ciAceScopedTraceCommercial::~AceScopedTraceCommercial() 9223b3eb3cSopenharmony_ci{ 9323b3eb3cSopenharmony_ci if (strValid_) { 9423b3eb3cSopenharmony_ci AceTraceEndCommercial(); 9523b3eb3cSopenharmony_ci } 9623b3eb3cSopenharmony_ci} 9723b3eb3cSopenharmony_ci 9823b3eb3cSopenharmony_ciAceScopedTraceFlag::AceScopedTraceFlag(bool flag, const char* format, ...) 9923b3eb3cSopenharmony_ci{ 10023b3eb3cSopenharmony_ci if (flag) { 10123b3eb3cSopenharmony_ci va_list args; 10223b3eb3cSopenharmony_ci va_start(args, format); 10323b3eb3cSopenharmony_ci flagTraceEnabled_ = AceTraceBeginWithArgv(format, args); 10423b3eb3cSopenharmony_ci va_end(args); 10523b3eb3cSopenharmony_ci } 10623b3eb3cSopenharmony_ci} 10723b3eb3cSopenharmony_ci 10823b3eb3cSopenharmony_ciAceScopedTraceFlag::~AceScopedTraceFlag() 10923b3eb3cSopenharmony_ci{ 11023b3eb3cSopenharmony_ci if (flagTraceEnabled_) { 11123b3eb3cSopenharmony_ci AceTraceEnd(); 11223b3eb3cSopenharmony_ci } 11323b3eb3cSopenharmony_ci} 11423b3eb3cSopenharmony_ci 11523b3eb3cSopenharmony_cistd::string ACE_EXPORT AceAsyncTraceBeginWithArgv(int32_t taskId, const char* format, va_list args) 11623b3eb3cSopenharmony_ci{ 11723b3eb3cSopenharmony_ci char name[MAX_STRING_SIZE] = { 0 }; 11823b3eb3cSopenharmony_ci if (vsnprintf_s(name, sizeof(name), sizeof(name) - 1, format, args) < 0) { 11923b3eb3cSopenharmony_ci return ""; 12023b3eb3cSopenharmony_ci } 12123b3eb3cSopenharmony_ci AceAsyncTraceBegin(taskId, name); 12223b3eb3cSopenharmony_ci return name; 12323b3eb3cSopenharmony_ci} 12423b3eb3cSopenharmony_ci 12523b3eb3cSopenharmony_cistd::string ACE_EXPORT AceAsyncTraceBeginWithArgs(int32_t taskId, char* format, ...) 12623b3eb3cSopenharmony_ci{ 12723b3eb3cSopenharmony_ci va_list args; 12823b3eb3cSopenharmony_ci va_start(args, format); 12923b3eb3cSopenharmony_ci std::string name = AceAsyncTraceBeginWithArgv(taskId, format, args); 13023b3eb3cSopenharmony_ci va_end(args); 13123b3eb3cSopenharmony_ci return name; 13223b3eb3cSopenharmony_ci} 13323b3eb3cSopenharmony_ci 13423b3eb3cSopenharmony_cistd::atomic<std::int32_t> AceAsyncScopedTrace::id_ = 0; 13523b3eb3cSopenharmony_ci 13623b3eb3cSopenharmony_ciAceAsyncScopedTrace::AceAsyncScopedTrace(const char* format, ...) 13723b3eb3cSopenharmony_ci{ 13823b3eb3cSopenharmony_ci taskId_ = id_++; 13923b3eb3cSopenharmony_ci va_list args; 14023b3eb3cSopenharmony_ci va_start(args, format); 14123b3eb3cSopenharmony_ci name_ = AceAsyncTraceBeginWithArgv(taskId_, format, args); 14223b3eb3cSopenharmony_ci va_end(args); 14323b3eb3cSopenharmony_ci} 14423b3eb3cSopenharmony_ci 14523b3eb3cSopenharmony_ciAceAsyncScopedTrace::~AceAsyncScopedTrace() 14623b3eb3cSopenharmony_ci{ 14723b3eb3cSopenharmony_ci if (!name_.empty()) { 14823b3eb3cSopenharmony_ci AceAsyncTraceEnd(taskId_, name_.c_str()); 14923b3eb3cSopenharmony_ci } 15023b3eb3cSopenharmony_ci} 15123b3eb3cSopenharmony_ci} // namespace OHOS::Ace 152