#include "define.h" #include "struct.h" time_t startup_time; int time_history [ 10 ]; time_data pulse_time [ MAX_TIME ]; time_data total_time [ MAX_TIME ]; time_data critical_time [ MAX_TIME ]; char *SWeekday[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; char *SMonth[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; const char* timezones [24] = { "7", "8", "9", "pacific", "mountain", "central", "eastern", "j", "k", "g", "h", "greenwich mean", "geneva", "central european", "russia", "m", "o", "p", "japan", "s", "t", "u", "v", "w" }; void order ( int*, float*, int, float ); void display_lag ( char_data*, int ); void display_time ( char_data*, const char*, int, char* = empty_string ); /* * SUPPORT ROUTINES */ bool is_day( ) { return( weather.hour >= 5 && weather.hour < 19 ); } /* * STRING PRINT FUNCTIONS */ void sprintf_minutes( char* tmp, const time_t time ) { int days = time/(60*60*24); int hours = (time/3600)%24; int minutes = (time/60)%60; tmp[0] = '\0'; if( days > 0 ) sprintf( tmp, "%d day%s ", days, days == 1 ? "" : "s" ); if( hours > 0 ) sprintf( tmp+strlen(tmp), "%d hour%s ", hours, hours == 1 ? "" : "s" ); sprintf( tmp+strlen(tmp), "%d minute%s", minutes, minutes == 1 ? "" : "s" ); } void sprintf_time( char* tmp, const time_t time, char letter ) { int hours = (time/3600+letter-'0')%12+1; int minutes = (time/60)%60; sprintf( tmp, "%d:%02d", hours, minutes ); } char* ltime( const time_t& time ) { struct tm* tmPtr = localtime( &time ); char* tmp = static_string( ); if( abs(int(time-current_time)) > 300*24*60*60 ) sprintf( tmp, "%s %s %02d %04d", SWeekday[tmPtr->tm_wday], SMonth[tmPtr->tm_mon], tmPtr->tm_mday, tmPtr->tm_year ); else sprintf( tmp, "%s %s %02d %02d:%02d", SWeekday[tmPtr->tm_wday], SMonth[tmPtr->tm_mon], tmPtr->tm_mday, tmPtr->tm_hour, tmPtr->tm_min ); return tmp; } void sprintf_date( char* tmp, const time_t time ) { struct tm* tmPtr = localtime( &time ); sprintf( tmp, "%s %d%s 19%d", SMonth[ tmPtr->tm_mon ], tmPtr->tm_mday, number_suffix( tmPtr->tm_mday ), tmPtr->tm_year ); } /* * LAG ROUTINES */ const time_data& stop_clock( struct timeval& start ) { static time_data time; struct timeval stop; gettimeofday( &stop, NULL ); time.tv_sec = stop.tv_sec-start.tv_sec; time.tv_usec = stop.tv_usec-start.tv_usec; if( time.tv_usec < 0 ) { time.tv_usec += 1000000; time.tv_sec -= 1; } return time; } void do_lag( char_data* ch, char* argument ) { char tmp [ ONE_LINE ]; int sum; int flags; int i, j; int list [ 50 ]; float value [ 50 ]; int length = strlen( argument ); if( !get_flags( ch, argument, &flags, "hr", "Lag" ) ) return;; if( is_set( &flags, 0 ) ) { for( sum = 0, i = 0; i < 10; i++ ) sum += time_history[i]; send_underlined( ch, "Sec. of Delay # of Cycles Percent\r\n" ); for( j = 0, i = 0; i < 10; i++, j = ( j == 0 ? 1 : 2*j ) ) { sprintf( tmp, "%.1f", (float) j/10 ); sprintf( tmp+10, "%8s %21d %16.2f\r\n", i == 0 ? "none" : ( i == 9 ? "more" : tmp ), time_history[i], (float) 100*time_history[i]/sum ); send( tmp+10, ch ); } return; } page_underlined( ch, "Command Calls Average Max Time Total\r\n" ); if( is_set( &flags, 1 ) ) { vzero( list, 50 ); vzero( value, 50 ); for( i = 0; i < MAX_ENTRY_COMMAND; i++ ) order( list, value, i, command_table[i].total_time.time() ); for( i = 0; i < 50; i++ ) display_lag( ch, list[i] ); return; } for( i = 0; i < MAX_ENTRY_COMMAND; i++ ) if( !strncasecmp( command_table[i].name, argument, length ) ) display_lag( ch, i ); return; } void order( int* list, float* value, int label, float num ) { int i; if( value[49] > num ) return; for( i = 49; i > 0; i-- ) { if( value[i-1] > num ) break; list[i] = list[i-1]; value[i] = value[i-1]; } list[i] = label; value[i] = num; return; } void display_lag( char_data* ch, int i ) { char tmp [ ONE_LINE ]; int calls; float total; float max; calls = command_table[i].calls; total = command_table[i].total_time.time( ); max = command_table[i].max_time.time( ); sprintf( tmp, "%-12s %8d %11.3f %11.3f %9.1f\r\n", command_table[i].name, calls, calls == 0 ? 0 : (float) total/(1000*calls), (float) max/1000, (float) total/1000 ); page( ch, tmp ); return; } /* * SYSTEM COMMAND */ void display_time( char_data* ch, const char* text, int num, char* c2 ) { float i, j; i = (float) 100.*total_time[num].hundred( ) /total_time[ TIME_ACTIVE ].hundred( ); j = (float) 100.*critical_time[num].hundred( ) /critical_time[ TIME_ACTIVE ].hundred( ); send( ch, "%-22s%4.1f%13.1f %s\r\n", text, i, j, c2 ); return; } void do_system( char_data* ch, char* ) { char* tmp = static_string( ); float i; send_centered( ch, "--| System Info |--" ); send( "\r\n", ch ); send( ch, "System Time: %s\r", (char*) ctime( ¤t_time ) ); send( ch, " Started at: %s\r\r\n", ctime( &boot_time ) ); send_underlined( ch, "Function Percent Critical\r\n" ); i = (float) total_time[ TIME_ACTIVE ].hundred( ) +total_time[ TIME_WAITING ].hundred( ); i = (float) 100.*critical_time[ TIME_WAITING ].hundred( )/i; sprintf( tmp, "Machine Lag: %3.1f%%", i ); display_time( ch, "Command Handler", TIME_COMMANDS, tmp ); i = (float) total_time[ TIME_ACTIVE ].hundred( ) +total_time[ TIME_WAITING ].hundred( ); i = (float) 100.*total_time[ TIME_ACTIVE ].hundred( )/i; sprintf( tmp, " Cpu Usage: %3.1f%%", i ); display_time( ch, "Network", TIME_NETWORK, tmp ); display_time( ch, " Read Input", TIME_READ_INPUT ); sprintf( tmp, "Seconds to start: %d", int( startup_time ) ); display_time( ch, " Write Output", TIME_WRITE_OUTPUT, tmp ); display_time( ch, " Host Deamon", TIME_DAEMON ); display_time( ch, "Update Handler", TIME_UPDATE ); display_time( ch, " Regeneration", TIME_REGEN ); display_time( ch, " Events", TIME_EVENT ); display_time( ch, " Violence", TIME_VIOLENCE ); display_time( ch, " Area Resets", TIME_RESET ); display_time( ch, " Object Loop", TIME_OBJ_LOOP ); display_time( ch, " Char Loop", TIME_CHAR_LOOP ); display_time( ch, " Rndm Acodes", TIME_RNDM_ACODE ); return; } /* * TIME FUNCTION */ void do_time( char_data* ch, char* argument ) { player_data* pc; int flags; if( !get_flags( ch, argument, &flags, "z", "Time" ) ) return; if( flags == 0 ) { send( ch, "Minute: %d Hour: %d Day: %d Month: %s\r\n", weather.minute, weather.hour, weather.day, month_name[weather.month] ); send( ch, "[This is temporary]\r\n" ); return; } if( ( pc = player( ch ) ) == NULL ) return; class type_field zonetype = { "timezone", 24, &timezones[0], &timezones[1], &pc->timezone }; zonetype.set( ch, empty_string, argument ); return; } /* * TIME ARGUMENTS */ int time_arg( char*& argument, char_data* ch ) { int i; if( !strcasecmp( argument, "forever" ) ) return 0; if( !number_arg( argument, i ) ) { send( ch, "Length of time must be of format <number> <units>.\r\n" ); return -1; } if( i < 1 ) { send( ch, "Only positive definite time periods are acceptable.\r\n" ); return -1; } if( *argument == '\0' ) { send( ch, "Please specify a unit of time.\r\n" ); return -1; } if( matches( argument, "seconds" ) ) return i; if( matches( argument, "minutes" ) ) return 60*i; if( matches( argument, "hours" ) ) return 60*60*i; if( matches( argument, "days" ) ) return 24*60*60*i; if( matches( argument, "years" ) ) return 365*24*60*60*i; send( ch, "Unknown unit of time.\r\nKnown units are seconds, minutes, hours,\ days, and years.\r\n" ); return -1; }