diff options
| author | erdgeist <> | 2007-10-13 17:40:37 +0000 |
|---|---|---|
| committer | erdgeist <> | 2007-10-13 17:40:37 +0000 |
| commit | 6c1adb8fc8c135cf0c3017e5ca6454747b0153e4 (patch) | |
| tree | 7e02a9b7ddb3b37ab443ebf65ddd879d59b75bff | |
| parent | 4c15dc7a70b189a7ae2cc66196c42f26881eb85e (diff) | |
since gettimeofday is rather expansive, we do only fetch time once in a 5 second period, when we are delivered a SIGALRM.
| -rw-r--r-- | opentracker.c | 32 | ||||
| -rw-r--r-- | trackerlogic.h | 5 |
2 files changed, 20 insertions, 17 deletions
diff --git a/opentracker.c b/opentracker.c index ad6dad4..ce33eb6 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -38,6 +38,7 @@ static time_t ot_start_time; | |||
| 38 | static const size_t SUCCESS_HTTP_HEADER_LENGTH = 80; | 38 | static const size_t SUCCESS_HTTP_HEADER_LENGTH = 80; |
| 39 | static const size_t SUCCESS_HTTP_SIZE_OFF = 17; | 39 | static const size_t SUCCESS_HTTP_SIZE_OFF = 17; |
| 40 | static char g_adminip[4] = {0,0,0,0}; | 40 | static char g_adminip[4] = {0,0,0,0}; |
| 41 | time_t g_now; | ||
| 41 | 42 | ||
| 42 | #if defined ( WANT_BLACKLISTING ) && defined (WANT_CLOSED_TRACKER ) | 43 | #if defined ( WANT_BLACKLISTING ) && defined (WANT_CLOSED_TRACKER ) |
| 43 | #error WANT_BLACKLISTING and WANT_CLOSED_TRACKER are exclusive. | 44 | #error WANT_BLACKLISTING and WANT_CLOSED_TRACKER are exclusive. |
| @@ -93,7 +94,7 @@ static void help( char *name ); | |||
| 93 | 94 | ||
| 94 | static void carp( const char *routine ); | 95 | static void carp( const char *routine ); |
| 95 | static void panic( const char *routine ); | 96 | static void panic( const char *routine ); |
| 96 | static void graceful( int s ); | 97 | static void signal_handler( int s ); |
| 97 | 98 | ||
| 98 | #define HTTPERROR_400 return httperror( s, "400 Invalid Request", "This server only understands GET." ) | 99 | #define HTTPERROR_400 return httperror( s, "400 Invalid Request", "This server only understands GET." ) |
| 99 | #define HTTPERROR_400_PARAM return httperror( s, "400 Invalid Request", "Invalid parameter" ) | 100 | #define HTTPERROR_400_PARAM return httperror( s, "400 Invalid Request", "Invalid parameter" ) |
| @@ -503,11 +504,14 @@ ANNOUNCE_WORKAROUND: | |||
| 503 | senddata( s, static_outbuf + reply_off, reply_size ); | 504 | senddata( s, static_outbuf + reply_off, reply_size ); |
| 504 | } | 505 | } |
| 505 | 506 | ||
| 506 | static void graceful( int s ) { | 507 | static void signal_handler( int s ) { |
| 507 | if( s == SIGINT ) { | 508 | if( s == SIGINT ) { |
| 508 | signal( SIGINT, SIG_IGN); | 509 | signal( SIGINT, SIG_IGN); |
| 509 | deinit_logic(); | 510 | deinit_logic(); |
| 510 | exit( 0 ); | 511 | exit( 0 ); |
| 512 | } else if( s == SIGALRM ) { | ||
| 513 | g_now = time(NULL); | ||
| 514 | alarm(5); | ||
| 511 | } | 515 | } |
| 512 | } | 516 | } |
| 513 | 517 | ||
| @@ -612,8 +616,7 @@ static void handle_accept( const int64 serversocket ) { | |||
| 612 | 616 | ||
| 613 | ++ot_overall_tcp_connections; | 617 | ++ot_overall_tcp_connections; |
| 614 | 618 | ||
| 615 | taia_now( &t ); | 619 | taia_uint( &t, (unsigned int)(g_now + OT_CLIENT_TIMEOUT) ); |
| 616 | taia_addsec( &t, &t, OT_CLIENT_TIMEOUT ); | ||
| 617 | io_timeout( i, t ); | 620 | io_timeout( i, t ); |
| 618 | } | 621 | } |
| 619 | 622 | ||
| @@ -722,15 +725,13 @@ static void handle_udp4( int64 serversocket ) { | |||
| 722 | } | 725 | } |
| 723 | 726 | ||
| 724 | static void server_mainloop( ) { | 727 | static void server_mainloop( ) { |
| 725 | tai6464 t, next_timeout_check; | 728 | time_t next_timeout_check = g_now + OT_CLIENT_TIMEOUT_CHECKINTERVAL; |
| 726 | |||
| 727 | taia_now( &next_timeout_check ); | ||
| 728 | 729 | ||
| 729 | for( ; ; ) { | 730 | for( ; ; ) { |
| 731 | tai6464 t; | ||
| 730 | int64 i; | 732 | int64 i; |
| 731 | 733 | ||
| 732 | taia_now( &t ); | 734 | taia_uint( &t, (unsigned int)(g_now + OT_CLIENT_TIMEOUT_CHECKINTERVAL) ); |
| 733 | taia_addsec( &t, &t, OT_CLIENT_TIMEOUT_CHECKINTERVAL ); | ||
| 734 | io_waituntil( t ); | 735 | io_waituntil( t ); |
| 735 | 736 | ||
| 736 | while( ( i = io_canread( ) ) != -1 ) { | 737 | while( ( i = io_canread( ) ) != -1 ) { |
| @@ -746,11 +747,9 @@ static void server_mainloop( ) { | |||
| 746 | while( ( i = io_canwrite( ) ) != -1 ) | 747 | while( ( i = io_canwrite( ) ) != -1 ) |
| 747 | handle_write( i ); | 748 | handle_write( i ); |
| 748 | 749 | ||
| 749 | taia_now( &t ); | 750 | if( g_now > next_timeout_check ) { |
| 750 | if( taia_less( &next_timeout_check, &t ) ) { | ||
| 751 | handle_timeouted( ); | 751 | handle_timeouted( ); |
| 752 | taia_now( &next_timeout_check ); | 752 | next_timeout_check = g_now + OT_CLIENT_TIMEOUT_CHECKINTERVAL; |
| 753 | taia_addsec( &next_timeout_check, &next_timeout_check, OT_CLIENT_TIMEOUT_CHECKINTERVAL); | ||
| 754 | } | 753 | } |
| 755 | 754 | ||
| 756 | /* See if we need to move our pools */ | 755 | /* See if we need to move our pools */ |
| @@ -874,13 +873,14 @@ int main( int argc, char **argv ) { | |||
| 874 | #endif | 873 | #endif |
| 875 | 874 | ||
| 876 | signal( SIGPIPE, SIG_IGN ); | 875 | signal( SIGPIPE, SIG_IGN ); |
| 877 | signal( SIGINT, graceful ); | 876 | signal( SIGINT, signal_handler ); |
| 878 | signal( SIGALRM, SIG_IGN ); | 877 | signal( SIGALRM, signal_handler ); |
| 879 | 878 | ||
| 880 | if( init_logic( serverdir ) == -1 ) | 879 | if( init_logic( serverdir ) == -1 ) |
| 881 | panic( "Logic not started" ); | 880 | panic( "Logic not started" ); |
| 882 | 881 | ||
| 883 | ot_start_time = time( NULL ); | 882 | g_now = ot_start_time = time( NULL ); |
| 883 | alarm(5); | ||
| 884 | 884 | ||
| 885 | server_mainloop( ); | 885 | server_mainloop( ); |
| 886 | 886 | ||
diff --git a/trackerlogic.h b/trackerlogic.h index 37e2451..596324e 100644 --- a/trackerlogic.h +++ b/trackerlogic.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <sys/types.h> | 7 | #include <sys/types.h> |
| 8 | #include <sys/time.h> | 8 | #include <sys/time.h> |
| 9 | #include <time.h> | 9 | #include <time.h> |
| 10 | #include <stdint.h> | ||
| 10 | 11 | ||
| 11 | /* Should be called BYTE, WORD, DWORD - but some OSs already have that and there's no #iftypedef */ | 12 | /* Should be called BYTE, WORD, DWORD - but some OSs already have that and there's no #iftypedef */ |
| 12 | /* They mark memory used as data instead of integer or human readable string - | 13 | /* They mark memory used as data instead of integer or human readable string - |
| @@ -39,7 +40,9 @@ typedef time_t ot_time; | |||
| 39 | 40 | ||
| 40 | #define OT_POOLS_COUNT 9 | 41 | #define OT_POOLS_COUNT 9 |
| 41 | #define OT_POOLS_TIMEOUT (60*5) | 42 | #define OT_POOLS_TIMEOUT (60*5) |
| 42 | #define NOW (time(NULL)/OT_POOLS_TIMEOUT) | 43 | |
| 44 | extern time_t g_now; | ||
| 45 | #define NOW (g_now/OT_POOLS_TIMEOUT) | ||
| 43 | 46 | ||
| 44 | #define OT_VECTOR_MIN_MEMBERS 16 | 47 | #define OT_VECTOR_MIN_MEMBERS 16 |
| 45 | #define OT_VECTOR_GROW_RATIO 4 | 48 | #define OT_VECTOR_GROW_RATIO 4 |
