diff --git a/session/src/nsmd.C b/session/src/nsmd.C index b67e5d0..7de8e3a 100644 --- a/session/src/nsmd.C +++ b/session/src/nsmd.C @@ -43,6 +43,7 @@ #include #include #include +#include #include /* for locking */ @@ -91,12 +92,14 @@ private: int _reply_errcode; char *_reply_message; + int _pending_command; /* */ + struct timeval _command_sent_time; + public: lo_address addr; /* */ char *name; /* client application name */ char *executable_path; /* path to client executable */ - int pending_command; /* */ int pid; /* PID of client process */ float progress; /* */ bool active; /* client has registered via announce */ @@ -137,7 +140,7 @@ public: bool reply_pending ( void ) { - return pending_command != COMMAND_NONE; + return _pending_command != COMMAND_NONE; } bool is_dumb_client ( void ) @@ -145,6 +148,29 @@ public: return capabilities == NULL; } + void pending_command ( int command ) + { + gettimeofday( &_command_sent_time, NULL ); + _pending_command = command; + } + + double milliseconds_since_last_command ( void ) const + { + struct timeval now; + + gettimeofday( &now, NULL ); + + double elapsedms = ( now.tv_sec - _command_sent_time.tv_sec ) * 1000.0; + elapsedms += ( now.tv_usec - _command_sent_time.tv_usec ) / 1000.0; + + return elapsedms; + } + + int pending_command ( void ) + { + return _pending_command; + } + Client ( ) { addr = 0; @@ -153,7 +179,7 @@ public: dead_because_we_said = false; pid = 0; progress = -0; - pending_command = 0; + _pending_command = 0; active = false; client_id = 0; capabilities = 0; @@ -200,7 +226,6 @@ clients_have_errors ( ) return false; } - Client * get_client_by_pid ( int pid ) { @@ -238,13 +263,13 @@ handle_client_process_death ( int pid ) { MESSAGE( "Client %s died.", c->name ); - if ( c->pending_command == COMMAND_KILL || - c->pending_command == COMMAND_QUIT ) + if ( c->pending_command() == COMMAND_KILL || + c->pending_command() == COMMAND_QUIT ) { c->dead_because_we_said = true; } - c->pending_command = COMMAND_NONE; + c->pending_command( COMMAND_NONE ); c->active = false; c->pid = 0; @@ -533,7 +558,7 @@ command_client_to_save ( Client *c ) MESSAGE( "Telling %s to save", c->name ); osc_server->send( c->addr, "/nsm/client/save" ); - c->pending_command = COMMAND_SAVE; + c->pending_command( COMMAND_SAVE ); if ( gui_is_active ) osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "save" ); @@ -564,7 +589,7 @@ void command_client_to_switch ( Client *c, const char *new_client_id ) free( full_client_id ); free( client_project_path ); - c->pending_command = COMMAND_OPEN; + c->pending_command( COMMAND_OPEN ); if ( gui_is_active ) { @@ -743,7 +768,7 @@ OSC_HANDLER( announce ) osc_server->send( lo_message_get_source( msg ), "/nsm/client/open", client_project_path, session_name, full_client_id ); - c->pending_command = COMMAND_OPEN; + c->pending_command( COMMAND_OPEN ); free( full_client_id ); free( client_project_path ); @@ -849,8 +874,8 @@ killed_clients_are_alive ( ) i != cl->end(); ++i ) { - if ( ( (*i)->pending_command == COMMAND_QUIT || - (*i)->pending_command == COMMAND_KILL ) && + if ( ( (*i)->pending_command() == COMMAND_QUIT || + (*i)->pending_command() == COMMAND_KILL ) && (*i)->pid > 0 ) return true; } @@ -924,7 +949,7 @@ command_client_to_quit ( Client *c ) if ( c->active ) { - c->pending_command = COMMAND_QUIT; + c->pending_command( COMMAND_QUIT ); kill( c->pid, SIGTERM ); @@ -939,8 +964,8 @@ command_client_to_quit ( Client *c ) osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "kill" ); /* should be kill? */ - c->pending_command = COMMAND_KILL; - + c->pending_command( COMMAND_KILL ); + // this is a dumb client... try and kill it kill( c->pid, SIGTERM ); } @@ -1621,8 +1646,8 @@ OSC_HANDLER( error ) c->set_reply( err_code, message ); - MESSAGE( "Client \"%s\" replied with error: %s (%i)", c->name, message, err_code ); - c->pending_command = COMMAND_NONE; + MESSAGE( "Client \"%s\" replied with error: %s (%i) in %fms", c->name, message, err_code, c->milliseconds_since_last_command() ); + c->pending_command( COMMAND_NONE ); if ( gui_is_active ) osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "error" ); @@ -1642,9 +1667,9 @@ OSC_HANDLER( reply ) { c->set_reply( ERR_OK, message ); - MESSAGE( "Client \"%s\" replied with: %s", c->name, message ); + MESSAGE( "Client \"%s\" replied with: %s in %fms", c->name, message, c->milliseconds_since_last_command() ); - c->pending_command = COMMAND_NONE; + c->pending_command( COMMAND_NONE ); if ( gui_is_active ) osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "ready" );