11e934351Sopenharmony_ci/*
21e934351Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41e934351Sopenharmony_ci * you may not use this file except in compliance with the License.
51e934351Sopenharmony_ci * You may obtain a copy of the License at
61e934351Sopenharmony_ci *
71e934351Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81e934351Sopenharmony_ci *
91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121e934351Sopenharmony_ci * See the License for the specific language governing permissions and
131e934351Sopenharmony_ci * limitations under the License.
141e934351Sopenharmony_ci */
151e934351Sopenharmony_ci
161e934351Sopenharmony_ci#include "request_tracer.h"
171e934351Sopenharmony_ci#include <atomic>
181e934351Sopenharmony_ci#if HAS_NETMANAGER_BASE
191e934351Sopenharmony_ci#include "hitrace_meter.h"
201e934351Sopenharmony_ci#endif
211e934351Sopenharmony_ci
221e934351Sopenharmony_ciOHOS::NetStack::RequestTracer::Trace::~Trace() = default;
231e934351Sopenharmony_ci
241e934351Sopenharmony_ci
251e934351Sopenharmony_ciOHOS::NetStack::RequestTracer::Trace::Trace(const std::string &className, int32_t idNum)
261e934351Sopenharmony_ci    : className_(className),
271e934351Sopenharmony_ci      stageName_(std::nullopt),
281e934351Sopenharmony_ci      idNum_(idNum)
291e934351Sopenharmony_ci{
301e934351Sopenharmony_ci}
311e934351Sopenharmony_ci
321e934351Sopenharmony_ciint32_t OHOS::NetStack::RequestTracer::Trace::GenerateId()
331e934351Sopenharmony_ci{
341e934351Sopenharmony_ci    static std::atomic_int32_t idNum = 0;
351e934351Sopenharmony_ci    return ++idNum;
361e934351Sopenharmony_ci}
371e934351Sopenharmony_ciOHOS::NetStack::RequestTracer::Trace::Trace(const std::string &className) : Trace(className, GenerateId())
381e934351Sopenharmony_ci{
391e934351Sopenharmony_ci}
401e934351Sopenharmony_ci
411e934351Sopenharmony_civoid OHOS::NetStack::RequestTracer::Trace::Tracepoint(const std::string &stage)
421e934351Sopenharmony_ci{
431e934351Sopenharmony_ci    if (stage == stageName_) {
441e934351Sopenharmony_ci        return;
451e934351Sopenharmony_ci    }
461e934351Sopenharmony_ci    Finish();
471e934351Sopenharmony_ci    stageName_ = stage;
481e934351Sopenharmony_ci#if HAS_NETMANAGER_BASE
491e934351Sopenharmony_ci    StartAsyncTrace(HITRACE_TAG_NET, className_ + "$$" + *stageName_, idNum_);
501e934351Sopenharmony_ci#endif
511e934351Sopenharmony_ci}
521e934351Sopenharmony_ci
531e934351Sopenharmony_civoid OHOS::NetStack::RequestTracer::Trace::Finish()
541e934351Sopenharmony_ci{
551e934351Sopenharmony_ci#if HAS_NETMANAGER_BASE
561e934351Sopenharmony_ci    if (stageName_) {
571e934351Sopenharmony_ci        FinishAsyncTrace(HITRACE_TAG_NET, className_ + "$$" + *stageName_, idNum_);
581e934351Sopenharmony_ci    }
591e934351Sopenharmony_ci#endif
601e934351Sopenharmony_ci}