Line data Source code
1 : /**
2 : * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "aicpusd_msq_operator_manager.h"
12 :
13 : #include <dlfcn.h>
14 : #include <map>
15 : #include <string>
16 :
17 : #include "aicpusd_status.h"
18 :
19 : namespace AicpuSchedule {
20 : namespace {
21 : const std::string MSQ_OPERATOR_SO_NAME = "libaicpu_msq_operator.so";
22 :
23 : template <typename FuncType>
24 267 : bool LoadSymbol(void* handle, const char* name, FuncType& func)
25 : {
26 267 : void* symbol = dlsym(handle, name);
27 267 : if ((symbol == nullptr)) {
28 1 : aicpusd_err("Load symbol failed, so=%s, symbol=%s", MSQ_OPERATOR_SO_NAME.c_str(), name);
29 1 : func = nullptr;
30 1 : return false;
31 : }
32 :
33 266 : func = reinterpret_cast<FuncType>(symbol);
34 266 : return true;
35 : }
36 : } // namespace
37 :
38 : void* MsqOperatorManager::handle_ = nullptr;
39 : bool MsqOperatorManager::inited_ = false;
40 : std::mutex MsqOperatorManager::mutex_;
41 : MsqOperatorManager::MsqResetFunc MsqOperatorManager::v1ResetT0Status_ = nullptr;
42 : MsqOperatorManager::MsqResetFunc MsqOperatorManager::v1ResetT1Status_ = nullptr;
43 : MsqOperatorManager::MsqReadStatusFunc MsqOperatorManager::v1ReadT0Status_ = nullptr;
44 : MsqOperatorManager::MsqReadStatusFunc MsqOperatorManager::v1ReadT1Status_ = nullptr;
45 : MsqOperatorManager::MsqReadDataFunc MsqOperatorManager::v1ReadT0Data_ = nullptr;
46 : MsqOperatorManager::MsqReadDataFunc MsqOperatorManager::v1ReadT1Data_ = nullptr;
47 : MsqOperatorManager::MsqSendRspFunc MsqOperatorManager::v1SendT0Response_ = nullptr;
48 : MsqOperatorManager::MsqSendRspFunc MsqOperatorManager::v1SendT1Response_ = nullptr;
49 : MsqOperatorManager::MsqResetFunc MsqOperatorManager::v2ResetT0Status_ = nullptr;
50 : MsqOperatorManager::MsqResetFunc MsqOperatorManager::v2ResetT1Status_ = nullptr;
51 : MsqOperatorManager::MsqReadStatusFunc MsqOperatorManager::v2ReadT1Status_ = nullptr;
52 : MsqOperatorManager::MsqReadDataFunc MsqOperatorManager::v2ReadT1Data_ = nullptr;
53 : MsqOperatorManager::MsqSendRspFunc MsqOperatorManager::v2SendT1Response_ = nullptr;
54 : MsqOperatorManager::WaitFunc MsqOperatorManager::waitFunc_ = nullptr;
55 :
56 29 : int32_t MsqOperatorManager::Init()
57 : {
58 29 : std::lock_guard<std::mutex> lock(mutex_);
59 29 : if (inited_) {
60 8 : return AICPU_SCHEDULE_OK;
61 : }
62 :
63 21 : handle_ = dlopen(MSQ_OPERATOR_SO_NAME.c_str(), RTLD_NOW);
64 21 : if (handle_ == nullptr) {
65 1 : aicpusd_err("Open so failed, so=%s, err=%s", MSQ_OPERATOR_SO_NAME.c_str(), dlerror());
66 1 : return AICPU_SCHEDULE_ERROR_INNER_ERROR;
67 : }
68 :
69 20 : if (!LoadAllSymbols()) {
70 1 : (void)dlclose(handle_);
71 1 : handle_ = nullptr;
72 1 : return AICPU_SCHEDULE_ERROR_INNER_ERROR;
73 : }
74 :
75 19 : inited_ = true;
76 19 : aicpusd_info("Init msq operator manager success, so=%s", MSQ_OPERATOR_SO_NAME.c_str());
77 19 : return AICPU_SCHEDULE_OK;
78 29 : }
79 :
80 42 : void MsqOperatorManager::Finalize()
81 : {
82 42 : std::lock_guard<std::mutex> lock(mutex_);
83 42 : if (handle_ != nullptr) {
84 19 : (void)dlclose(handle_);
85 19 : handle_ = nullptr;
86 : }
87 :
88 42 : inited_ = false;
89 42 : v1ResetT0Status_ = nullptr;
90 42 : v1ResetT1Status_ = nullptr;
91 42 : v1ReadT0Status_ = nullptr;
92 42 : v1ReadT1Status_ = nullptr;
93 42 : v1ReadT0Data_ = nullptr;
94 42 : v1ReadT1Data_ = nullptr;
95 42 : v1SendT0Response_ = nullptr;
96 42 : v1SendT1Response_ = nullptr;
97 42 : v2ResetT0Status_ = nullptr;
98 42 : v2ResetT1Status_ = nullptr;
99 42 : v2ReadT1Status_ = nullptr;
100 42 : v2ReadT1Data_ = nullptr;
101 42 : v2SendT1Response_ = nullptr;
102 42 : waitFunc_ = nullptr;
103 42 : }
104 :
105 20 : bool MsqOperatorManager::LoadAllSymbols()
106 : {
107 : const std::map<std::string, RawFuncPtr*> symbolTable = {
108 0 : {"MsqV1ResetT0Status", reinterpret_cast<RawFuncPtr*>(&v1ResetT0Status_)},
109 0 : {"MsqV1ResetT1Status", reinterpret_cast<RawFuncPtr*>(&v1ResetT1Status_)},
110 0 : {"MsqV1ReadT0Status", reinterpret_cast<RawFuncPtr*>(&v1ReadT0Status_)},
111 0 : {"MsqV1ReadT1Status", reinterpret_cast<RawFuncPtr*>(&v1ReadT1Status_)},
112 0 : {"MsqV1ReadT0Data", reinterpret_cast<RawFuncPtr*>(&v1ReadT0Data_)},
113 0 : {"MsqV1ReadT1Data", reinterpret_cast<RawFuncPtr*>(&v1ReadT1Data_)},
114 0 : {"MsqV1SendT0Response", reinterpret_cast<RawFuncPtr*>(&v1SendT0Response_)},
115 0 : {"MsqV1SendT1Response", reinterpret_cast<RawFuncPtr*>(&v1SendT1Response_)},
116 0 : {"MsqV2ResetT0Status", reinterpret_cast<RawFuncPtr*>(&v2ResetT0Status_)},
117 0 : {"MsqV2ResetT1Status", reinterpret_cast<RawFuncPtr*>(&v2ResetT1Status_)},
118 0 : {"MsqV2ReadT1Status", reinterpret_cast<RawFuncPtr*>(&v2ReadT1Status_)},
119 0 : {"MsqV2ReadT1Data", reinterpret_cast<RawFuncPtr*>(&v2ReadT1Data_)},
120 0 : {"MsqV2SendT1Response", reinterpret_cast<RawFuncPtr*>(&v2SendT1Response_)},
121 0 : {"Wait", reinterpret_cast<RawFuncPtr*>(&waitFunc_)},
122 320 : };
123 :
124 286 : for (const auto& symbol : symbolTable) {
125 267 : if (!LoadSymbol(handle_, symbol.first.c_str(), *symbol.second)) {
126 1 : return false;
127 : }
128 : }
129 :
130 19 : return true;
131 40 : }
132 :
133 11 : void MsqOperatorManager::CallV1ResetT0Status() { v1ResetT0Status_(); }
134 :
135 10 : void MsqOperatorManager::CallV1ResetT1Status() { v1ResetT1Status_(); }
136 :
137 12 : MsqStatus MsqOperatorManager::CallV1ReadT0Status() { return v1ReadT0Status_(); }
138 :
139 1 : MsqStatus MsqOperatorManager::CallV1ReadT1Status() { return v1ReadT1Status_(); }
140 :
141 2 : void MsqOperatorManager::CallV1ReadT0Data(uint32_t msgSize, MsqDatas* datas) { v1ReadT0Data_(msgSize, datas); }
142 :
143 2 : void MsqOperatorManager::CallV1ReadT1Data(uint32_t msgSize, MsqDatas* datas) { v1ReadT1Data_(msgSize, datas); }
144 :
145 2 : void MsqOperatorManager::CallV1SendT0Response() { v1SendT0Response_(); }
146 :
147 2 : void MsqOperatorManager::CallV1SendT1Response() { v1SendT1Response_(); }
148 :
149 1 : void MsqOperatorManager::CallV2ResetT0Status() { v2ResetT0Status_(); }
150 :
151 1 : void MsqOperatorManager::CallV2ResetT1Status() { v2ResetT1Status_(); }
152 :
153 1 : MsqStatus MsqOperatorManager::CallV2ReadT1Status() { return v2ReadT1Status_(); }
154 :
155 1 : void MsqOperatorManager::CallV2ReadT1Data(uint32_t msgSize, MsqDatas* datas) { v2ReadT1Data_(msgSize, datas); }
156 :
157 1 : void MsqOperatorManager::CallV2SendT1Response() { v2SendT1Response_(); }
158 :
159 2 : void MsqOperatorManager::CallWait()
160 : {
161 2 : waitFunc_();
162 2 : return;
163 : }
164 : } // namespace AicpuSchedule
|