diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 133f7e4d47073621422f2f5555fd52c4d36f1259..8196096c8ca8bff1f41bdcb792d675c62539b304 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -23,6 +23,7 @@ #include "file_access_service_proxy.h" #include "hilog_wrapper.h" #include "hitrace_meter.h" +#include "user_access_tracer.h" #include "if_system_ability_manager.h" #include "ifile_access_ext_base.h" #include "ipc_skeleton.h" @@ -172,16 +173,15 @@ static bool IsSystemApp() std::pair, int> FileAccessHelper::Creator( const std::shared_ptr &context) { - StartTrace(HITRACE_TAG_FILEMANAGEMENT, "Creator"); + UserAccessTracer trace; + trace.Start("Creator"); if (context == nullptr) { HILOG_ERROR("FileAccessHelper::Creator failed, context == nullptr"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, EINVAL}; } if (!IsSystemApp()) { HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_PERMISSION_SYS}; } @@ -193,7 +193,6 @@ std::pair, int> FileAccessHelper::Creator( AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, GetUserId(), extensionInfos); if (!ret) { HILOG_ERROR("FileAccessHelper::Creator QueryExtensionAbilityInfos failed"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_GETINFO}; } @@ -203,7 +202,6 @@ std::pair, int> FileAccessHelper::Creator( sptr fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection()); if (fileAccessExtConnection == nullptr) { HILOG_ERROR("new fileAccessExtConnection fail"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_GETRESULT}; } @@ -214,14 +212,12 @@ std::pair, int> FileAccessHelper::Creator( sptr fileExtProxy = fileAccessExtConnection->GetFileExtProxy(); if (fileExtProxy == nullptr) { HILOG_ERROR("Creator get invalid fileExtProxy"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_CONNECT}; } std::shared_ptr connectInfo = std::make_shared(); if (!connectInfo) { HILOG_ERROR("Creator, connectInfo == nullptr"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_GETRESULT}; } FileAccessHelper::wants_.push_back(wantTem); @@ -233,11 +229,9 @@ std::pair, int> FileAccessHelper::Creator( FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap); if (ptrFileAccessHelper == nullptr) { HILOG_ERROR("FileAccessHelper::Creator failed, create FileAccessHelper failed"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {nullptr, E_GETRESULT}; } - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return {std::shared_ptr(ptrFileAccessHelper), ERR_OK}; } diff --git a/utils/user_access_tracer.h b/utils/user_access_tracer.h new file mode 100644 index 0000000000000000000000000000000000000000..d0e9c2fbd1db652571d30ae989321cbccfeedfc2 --- /dev/null +++ b/utils/user_access_tracer.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_USER_ACCESS_TRACER +#define OHOS_USER_ACCESS_TRACER + +#include +#include "hitrace_meter.h" + +class UserAccessTracer final { +public: + UserAccessTracer() = default; + + virtual ~UserAccessTracer() + { + for (int32_t i = 0; i < count_; i++ ) { + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + } + count_ = 0; + } + + void Start(const std::string &label) + { + StartTrace(HITRACE_TAG_FILEMANAGEMENT, label); + count_++; + } + + void Finish() + { + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + count_--; + } +private: + int32_t count_ = 0; + +}; + +#endif // OHOS_USER_ACCESS_TRACER