1 /* 2 * Copyright (c) 2025 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 #ifndef HIVIEWDFX_HIVIEW_TELEMETRY_STATE_MACHINE_H 16 #define HIVIEWDFX_HIVIEW_TELEMETRY_STATE_MACHINE_H 17 #include <memory> 18 19 #include "trace_common.h" 20 21 namespace OHOS::HiviewDFX::Telemetry { 22 class TeleMetryStateMachine; 23 class BaseState { 24 public: 25 friend class TeleMetryStateMachine; 26 virtual ~BaseState() = default; 27 virtual bool IsTraceOn() = 0; 28 virtual TraceRet TraceOn() = 0; 29 virtual TraceRet TraceOff() = 0; 30 virtual TraceRet PostOn(uint64_t time) = 0; 31 virtual TraceRet TimeOut() = 0; 32 33 protected: 34 virtual std::string GetTag() = 0; 35 }; 36 37 class InitState : public BaseState { 38 public: InitState(std::shared_ptr<TeleMetryStateMachine> stateMachine)39 explicit InitState(std::shared_ptr<TeleMetryStateMachine> stateMachine) : stateMachine_(stateMachine) {} 40 41 bool IsTraceOn() override; 42 TraceRet TraceOn() override; 43 TraceRet TraceOff() override; 44 TraceRet PostOn(uint64_t time) override; 45 TraceRet TimeOut() override; 46 protected: 47 std::string GetTag() override; 48 49 private: 50 std::weak_ptr<TeleMetryStateMachine> stateMachine_; 51 }; 52 53 class TraceOnState : public BaseState { 54 public: TraceOnState(std::weak_ptr<TeleMetryStateMachine> stateMachine)55 explicit TraceOnState(std::weak_ptr<TeleMetryStateMachine> stateMachine) : stateMachine_(stateMachine) {} 56 57 bool IsTraceOn() override; 58 TraceRet TraceOn() override; 59 TraceRet TraceOff() override; 60 TraceRet PostOn(uint64_t time) override; 61 TraceRet TimeOut() override; 62 SetPostEndTime(uint64_t postEndTime)63 void SetPostEndTime(uint64_t postEndTime) 64 { 65 postEndTime_ = postEndTime; 66 } 67 SetTraceOnCount(uint32_t traceOnCount)68 void SetTraceOnCount(uint32_t traceOnCount) 69 { 70 traceOnCount_ = traceOnCount; 71 } 72 73 protected: 74 std::string GetTag() override; 75 private: 76 std::weak_ptr<TeleMetryStateMachine> stateMachine_; 77 uint32_t traceOnCount_ = 0; 78 uint64_t postEndTime_ = 0; 79 }; 80 81 class TeleMetryStateMachine { 82 public: 83 friend class InitState; 84 friend class TraceOnState; 85 IsTraceOn()86 bool IsTraceOn() 87 { 88 return currentState_->IsTraceOn(); 89 } 90 TraceOn()91 TraceRet TraceOn() 92 { 93 return currentState_->TraceOn(); 94 } 95 TraceOff()96 TraceRet TraceOff() 97 { 98 return currentState_->TraceOff(); 99 } 100 PostOn(uint64_t time)101 TraceRet PostOn(uint64_t time) 102 { 103 return currentState_->PostOn(time); 104 } 105 TimeOut()106 TraceRet TimeOut() 107 { 108 return currentState_->TimeOut(); 109 } 110 RegisterTelemetryCallback(std::shared_ptr<TelemetryCallback> stateCallback)111 void RegisterTelemetryCallback(std::shared_ptr<TelemetryCallback> stateCallback) 112 { 113 stateCallback_ = stateCallback; 114 } 115 SetInitState(std::shared_ptr<InitState> initStateState)116 void SetInitState(std::shared_ptr<InitState> initStateState) 117 { 118 initStateState_ = initStateState; 119 } 120 SetTraceOnState(std::shared_ptr<TraceOnState> traceOnState)121 void SetTraceOnState(std::shared_ptr<TraceOnState> traceOnState) 122 { 123 traceOnState_ = traceOnState; 124 } 125 126 TraceRet TransToInitState(); 127 TraceRet TransToTraceOnState(uint32_t traceOnCount, uint64_t postEndTime); 128 129 private: 130 std::shared_ptr<BaseState> currentState_; 131 std::shared_ptr<InitState> initStateState_; 132 std::shared_ptr<TraceOnState> traceOnState_; 133 std::shared_ptr<TelemetryCallback> stateCallback_; 134 }; 135 } 136 #endif //HIVIEWDFX_HIVIEW_TELEMETRY_STATE_MACHINE_H 137