| /** |
| @section license License |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you 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. |
| */ |
| #include "mgmt/rpc/server/RPCServer.h" |
| #include "mgmt/rpc/server/IPCSocketServer.h" |
| |
| rpc::RPCServer *jsonrpcServer = nullptr; |
| |
| namespace rpc |
| { |
| static DbgCtl dbg_ctl{"rpc"}; |
| |
| RPCServer::RPCServer(config::RPCConfig const &conf) |
| { |
| switch (conf.get_comm_type()) { |
| case config::RPCConfig::CommType::UNIX: { |
| _socketImpl = std::make_unique<comm::IPCSocketServer>(); |
| if (!_socketImpl->configure(conf.get_comm_config_params())) { |
| Dbg(dbg_ctl, "Unable to configure the socket: Stick to the default configuration."); |
| } |
| } break; |
| default:; |
| throw std::runtime_error("Unsupported communication type."); |
| }; |
| |
| // make sure we can initialize it. |
| if (auto ec = _socketImpl->init(); ec) { |
| throw std::runtime_error(ec.message()); |
| } |
| } |
| |
| std::string_view |
| RPCServer::selected_comm_name() const noexcept |
| { |
| return _socketImpl->name(); |
| } |
| |
| RPCServer::~RPCServer() |
| { |
| stop_thread(); |
| } |
| |
| void * /* static */ |
| RPCServer::run_thread(void *a) |
| { |
| auto *server = static_cast<RPCServer *>(a); |
| if (server->_init) { |
| server->_rpcThread = server->_init(); |
| } |
| server->_socketImpl->run(); |
| Dbg(dbg_ctl, "Socket stopped"); |
| return a; |
| } |
| |
| void |
| RPCServer::start_thread(std::function<TSThread()> const &cb_init, std::function<void(TSThread)> const &cb_destroy) |
| { |
| Dbg(dbg_ctl, "Starting RPC Server on: %s", _socketImpl->name().c_str()); |
| _init = cb_init; |
| _destroy = cb_destroy; |
| |
| ink_thread_create(&_this_thread, run_thread, this, 0, 0, nullptr); |
| } |
| |
| void |
| RPCServer::stop_thread() |
| { |
| _socketImpl->stop(); |
| |
| ink_thread_join(_this_thread); |
| _this_thread = ink_thread_null(); |
| Dbg(dbg_ctl, "Stopping RPC server on: %s", _socketImpl->name().c_str()); |
| } |
| } // namespace rpc |