X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcommand_server.cpp;h=2e3beb5b0d923e8ce63cf3f9f6e9b0ce1eea382a;hp=f5968603e77ecc60c4f81f85e784ee7a42e97885;hb=4b995a82e29808cf8125889f83ec70fc7b5c77af;hpb=c7857475c8b0f02cac3ce29a617a4d542fa59f37 diff --git a/src/command_server.cpp b/src/command_server.cpp index f596860..2e3beb5 100644 --- a/src/command_server.cpp +++ b/src/command_server.cpp @@ -44,15 +44,17 @@ namespace libt2n { command_server::command_server(server& _s) - : s(_s) + : s(_s), guard_handle(0) { // register callback s.add_callback(new_connection,bind(&command_server::send_hello, boost::ref(*this), _1)); } +/// send a hello message to a new connection void command_server::send_hello(unsigned int conn_id) { server_connection* sc=s.get_connection(conn_id); + // TODO: Gerd: Throw exception if get_connection() returns NULL or just return? std::ostringstream hello; @@ -157,32 +159,46 @@ void command_server::handle_packet(const std::string& packet, server_connection* /** @brief handle incoming commands @param[in,out] usec_timeout wait until new data is found, max timeout usecs. -1: wait endless, 0: instant return + @param[out] usec_timeout_remaining microseconds from the timeout that were not used */ void command_server::handle(long long usec_timeout, long long* usec_timeout_remaining) { - if (s.fill_buffer(usec_timeout,usec_timeout_remaining)) + guard_handle++; + try { - std::string packet; - unsigned int conn_id; - - while (s.get_packet(packet,conn_id)) + if (s.fill_buffer(usec_timeout,usec_timeout_remaining)) { - server_connection* conn=s.get_connection(conn_id); - if (!conn) - EXCEPTIONSTREAM(error,logic_error,"illegal connection id " << conn_id << " received"); + std::string packet; + unsigned int conn_id; - try - { handle_packet(packet,conn); } - catch (t2n_transfer_error &e) + while (s.get_packet(packet,conn_id)) { - // shut down a connection with transfer errors (usually write errors) - conn->close(); + server_connection* conn=s.get_connection(conn_id); + if (!conn) + EXCEPTIONSTREAM(error,logic_error,"illegal connection id " << conn_id << " received"); + + try + { handle_packet(packet,conn); } + catch (t2n_transfer_error &e) + { + // shut down a connection with transfer errors (usually write errors) + conn->close(); + } + catch(...) + { throw; } } - catch(...) - { throw; } } } - s.cleanup(); + catch(...) + { + guard_handle--; + throw; + } + guard_handle--; + + // don't call cleanup on re-entered handle-calls + if (guard_handle == 0) + s.cleanup(); } }