extern "C" struct dnet_node *dnet_parse_config(const char *file, int mon) { dnet_node *node = NULL; config_data *data = NULL; try { data = static_cast<config_data *>(dnet_config_data_create()); if (!data) throw std::bad_alloc(); data->config_path = file; auto parser = data->parse_config(); const config root = parser->root(); const config logger = root.at("logger"); const config options = root.at("options"); const config backends = root.at("backends"); parse_logger(data, logger); parse_options(data, options); parse_backends(data, backends); if (data->daemon_mode && !mon) dnet_background(); if (!data->cfg_addr_num) throw config_error("no local address specified, exiting"); node = dnet_server_node_create(data); if (!node) throw config_error("failed to create node"); static_assert(sizeof(dnet_addr) == sizeof(address), "Size of dnet_addr and size of address must be equal"); if (data->remotes.size() != 0) { int err = dnet_add_state(node, reinterpret_cast<const dnet_addr *>(data->remotes.data()), data->remotes.size(), 0); if (err < 0) BH_LOG(*node->log, DNET_LOG_WARNING, "Failed to connect to remote nodes: %d", err); } } catch (std::exception &exc) { if (data && data->cfg_state.log) { dnet_backend_log(data->cfg_state.log, DNET_LOG_ERROR, "cnf: failed to read config file '%s': %s", file, exc.what()); } else { fprintf(stderr, "cnf: %s\n", exc.what()); fflush(stderr); } if (node) dnet_server_node_destroy(node); else if (data) dnet_config_data_destroy(data); return NULL; } return node; }
void server_node::stop() { if (!m_node) throw std::runtime_error("Server node \"" + m_path + "\" is already stoped"); dnet_set_need_exit(m_node); dnet_server_node_destroy(m_node); m_node = NULL; }
void server_node::wait_to_stop() { if (m_fork) { int result; waitpid(m_pid, &result, 0); m_pid = 0; } else if (m_node) { dnet_server_node_destroy(m_node); m_node = NULL; } }