NSM: Time client responses.

This commit is contained in:
Jonathan Moore Liles 2012-02-27 20:28:58 -08:00
parent 250b7db644
commit 388796a1c4
1 changed files with 44 additions and 19 deletions

View File

@ -43,6 +43,7 @@
#include <ftw.h>
#include <list>
#include <getopt.h>
#include <sys/time.h>
#include <OSC/Endpoint.H>
/* 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,7 +964,7 @@ 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" );