32 #include <boost/thread/mutex.hpp> 33 #include <boost/thread/thread.hpp> 44 #define EXIT_ON_ERROR(cond) { if (!(cond)) { LOG_PRINT_L0("ERROR: " << #cond); exit(1); } else {} } 51 : m_tcp_server(tcp_server)
52 , m_open_close_test_conn_id(boost::uuids::nil_uuid())
63 boost::unique_lock<boost::mutex> lock(m_open_close_test_mutex);
64 if (!m_open_close_test_conn_id.is_nil())
74 boost::unique_lock<boost::mutex> lock(m_open_close_test_mutex);
75 if (
context.m_connection_id == m_open_close_test_conn_id)
78 m_open_close_test_conn_id = boost::uuids::nil_uuid();
79 m_open_close_test_helper.reset(0);
97 close_connections(
context.m_connection_id);
112 m_new_connection_counter.reset();
113 m_new_connection_counter.inc();
114 m_close_connection_counter.reset();
120 boost::unique_lock<boost::mutex> lock(m_open_close_test_mutex);
121 if (0 == m_open_close_test_helper.get())
125 m_open_close_test_conn_id =
context.m_connection_id;
138 m_tcp_server.send_stop_signal();
148 CMD_DATA_REQUEST::request req2;
149 req2.data.resize(req.request_size);
151 bool r = epee::net_utils::async_invoke_remote_command2<CMD_DATA_REQUEST::response>(ctx.m_connection_id, CMD_DATA_REQUEST::ID, req2,
152 m_tcp_server.get_config_object(), [=](int code, const CMD_DATA_REQUEST::response& rsp, const test_connection_context&) {
155 LOG_PRINT_L0(
"Failed to invoke CMD_DATA_REQUEST. code = " << code);
170 LOG_PRINT_L0(
"Closing connections. Number of opened connections: " << m_tcp_server.get_config_object().get_connections_count());
180 m_tcp_server.get_config_object().close(ctx.m_connection_id);
184 LOG_PRINT_L0(count <<
" connection already closed");
193 boost::shared_ptr<boost::asio::deadline_timer> sh_deadline(
new boost::asio::deadline_timer(m_tcp_server.get_io_service(), boost::posix_time::seconds(7)));
194 sh_deadline->async_wait([=](
const boost::system::error_code& ec)
196 boost::shared_ptr<boost::asio::deadline_timer> t = sh_deadline;
199 close_connections(cmd_conn_id);
203 LOG_PRINT_L0(
"ERROR: " << ec.message() <<
':' << ec.value());
213 boost::mutex m_open_close_test_mutex;
214 std::unique_ptr<open_close_test_helper> m_open_close_test_helper;
218 int main(
int argc,
char** argv)
225 size_t thread_count = (std::max)(
min_thread_count, boost::thread::hardware_concurrency() / 2);
231 srv_levin_commands_handler *commands_handler =
new srv_levin_commands_handler(tcp_server);
236 if (!tcp_server.
run_server(thread_count,
true))
#define HANDLE_NOTIFY_T2(NOTIFY, func)
std::string mlog_get_default_log_path(const char *default_filename)
void mlog_configure(const std::string &filename_base, bool console, const std::size_t max_log_file_size=MAX_LOG_FILE_SIZE, const std::size_t max_log_files=MAX_LOG_FILES)
uint64_t opened_connections_count
bool init_server(uint32_t port, const std::string address="0.0.0.0", ssl_options_t ssl_options=ssl_support_t::e_ssl_support_autodetect)
bool run_server(size_t threads_count, bool wait=true, const boost::thread::attributes &attrs=boost::thread::attributes())
Run the server's io_service loop.
uint64_t max_opened_conn_count
uint64_t close_connection_counter
#define BEGIN_INVOKE_MAP2(owner_type)
mdb_size_t count(MDB_cursor *cur)
#define EXIT_ON_ERROR(cond)
int main(int argc, char **argv)
std::unique_ptr< void, terminate > context
Unique ZMQ context handle, calls zmq_term on destruction.
virtual void on_connection_new(test_connection_context &context)
#define END_INVOKE_MAP2()
std::string to_string() const
#define HANDLE_INVOKE_T2(COMMAND, func)
virtual void on_connection_close(test_connection_context &context)
#define CHAIN_LEVIN_NOTIFY_MAP2(context_type)
const std::string srv_port("36231")
uint64_t open_request_target
uint64_t new_connection_counter
const unsigned int min_thread_count
#define CHAIN_LEVIN_INVOKE_MAP2(context_type)
#define CATCH_ENTRY_L0(lacation, return_val)
const boost::uuids::uuid m_connection_id
t_protocol_handler::config_type & get_config_object()