diff options
| author | erdgeist <> | 2008-12-07 03:50:51 +0000 |
|---|---|---|
| committer | erdgeist <> | 2008-12-07 03:50:51 +0000 |
| commit | c6947b160f99278057df0770b849b46264b72229 (patch) | |
| tree | 8c5e543648458f7368d51906c53a9e1b45a8c364 | |
| parent | ad8c9ee1efac171e5f3a8f41a630254ac88357a8 (diff) | |
Handle program end more politely
| -rw-r--r-- | opentracker.c | 8 | ||||
| -rw-r--r-- | ot_accesslist.c | 4 | ||||
| -rw-r--r-- | ot_accesslist.h | 2 | ||||
| -rw-r--r-- | ot_clean.c | 2 | ||||
| -rw-r--r-- | ot_fullscrape.c | 10 | ||||
| -rw-r--r-- | ot_livesync.c | 9 | ||||
| -rw-r--r-- | ot_livesync.h | 1 | ||||
| -rw-r--r-- | ot_stats.c | 10 | ||||
| -rw-r--r-- | trackerlogic.c | 13 | ||||
| -rw-r--r-- | trackerlogic.h | 1 |
10 files changed, 48 insertions, 12 deletions
diff --git a/opentracker.c b/opentracker.c index 022f561..1e996d9 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -34,9 +34,10 @@ | |||
| 34 | #include "ot_livesync.h" | 34 | #include "ot_livesync.h" |
| 35 | 35 | ||
| 36 | /* Globals */ | 36 | /* Globals */ |
| 37 | time_t g_now_seconds; | 37 | time_t g_now_seconds; |
| 38 | char * g_redirecturl = NULL; | 38 | char * g_redirecturl = NULL; |
| 39 | uint32_t g_tracker_id; | 39 | uint32_t g_tracker_id; |
| 40 | volatile int g_opentracker_running = 1; | ||
| 40 | 41 | ||
| 41 | static char * g_serverdir = NULL; | 42 | static char * g_serverdir = NULL; |
| 42 | 43 | ||
| @@ -51,6 +52,7 @@ static void panic( const char *routine ) { | |||
| 51 | static void signal_handler( int s ) { | 52 | static void signal_handler( int s ) { |
| 52 | if( s == SIGINT ) { | 53 | if( s == SIGINT ) { |
| 53 | signal( SIGINT, SIG_IGN); | 54 | signal( SIGINT, SIG_IGN); |
| 55 | g_opentracker_running = 0; | ||
| 54 | 56 | ||
| 55 | trackerlogic_deinit(); | 57 | trackerlogic_deinit(); |
| 56 | exit( 0 ); | 58 | exit( 0 ); |
diff --git a/ot_accesslist.c b/ot_accesslist.c index f4c21c5..3b8e8a9 100644 --- a/ot_accesslist.c +++ b/ot_accesslist.c | |||
| @@ -23,6 +23,10 @@ | |||
| 23 | char *g_accesslist_filename = NULL; | 23 | char *g_accesslist_filename = NULL; |
| 24 | static ot_vector accesslist; | 24 | static ot_vector accesslist; |
| 25 | 25 | ||
| 26 | static void access_list_deinit( void ) { | ||
| 27 | accesslist_reset( ); | ||
| 28 | } | ||
| 29 | |||
| 26 | static void accesslist_reset( void ) { | 30 | static void accesslist_reset( void ) { |
| 27 | free( accesslist.data ); | 31 | free( accesslist.data ); |
| 28 | byte_zero( &accesslist, sizeof( accesslist ) ); | 32 | byte_zero( &accesslist, sizeof( accesslist ) ); |
diff --git a/ot_accesslist.h b/ot_accesslist.h index 9c93187..15a21f2 100644 --- a/ot_accesslist.h +++ b/ot_accesslist.h | |||
| @@ -13,12 +13,14 @@ | |||
| 13 | #if defined ( WANT_ACCESSLIST_BLACK ) || defined (WANT_ACCESSLIST_WHITE ) | 13 | #if defined ( WANT_ACCESSLIST_BLACK ) || defined (WANT_ACCESSLIST_WHITE ) |
| 14 | #define WANT_ACCESSLIST | 14 | #define WANT_ACCESSLIST |
| 15 | void accesslist_init( ); | 15 | void accesslist_init( ); |
| 16 | void accesslist_deinit( ); | ||
| 16 | int accesslist_hashisvalid( ot_hash *hash ); | 17 | int accesslist_hashisvalid( ot_hash *hash ); |
| 17 | 18 | ||
| 18 | extern char *g_accesslist_filename; | 19 | extern char *g_accesslist_filename; |
| 19 | 20 | ||
| 20 | #else | 21 | #else |
| 21 | #define accesslist_init( accesslist_filename ) | 22 | #define accesslist_init( accesslist_filename ) |
| 23 | #define accesslist_deinit( ) | ||
| 22 | #define accesslist_hashisvalid( hash ) 1 | 24 | #define accesslist_hashisvalid( hash ) 1 |
| 23 | #endif | 25 | #endif |
| 24 | 26 | ||
| @@ -114,6 +114,8 @@ static void * clean_worker( void * args ) { | |||
| 114 | } | 114 | } |
| 115 | } | 115 | } |
| 116 | mutex_bucket_unlock( bucket ); | 116 | mutex_bucket_unlock( bucket ); |
| 117 | if( !g_opentracker_running ) | ||
| 118 | return NULL; | ||
| 117 | usleep( OT_CLEAN_SLEEP ); | 119 | usleep( OT_CLEAN_SLEEP ); |
| 118 | } | 120 | } |
| 119 | } | 121 | } |
diff --git a/ot_fullscrape.c b/ot_fullscrape.c index 5f61afd..9a6effb 100644 --- a/ot_fullscrape.c +++ b/ot_fullscrape.c | |||
| @@ -65,6 +65,8 @@ static void * fullscrape_worker( void * args ) { | |||
| 65 | fullscrape_make( &iovec_entries, &iovector, tasktype ); | 65 | fullscrape_make( &iovec_entries, &iovector, tasktype ); |
| 66 | if( mutex_workqueue_pushresult( taskid, iovec_entries, iovector ) ) | 66 | if( mutex_workqueue_pushresult( taskid, iovec_entries, iovector ) ) |
| 67 | iovec_free( &iovec_entries, &iovector ); | 67 | iovec_free( &iovec_entries, &iovector ); |
| 68 | if( !g_opentracker_running ) | ||
| 69 | return NULL; | ||
| 68 | } | 70 | } |
| 69 | return NULL; | 71 | return NULL; |
| 70 | } | 72 | } |
| @@ -150,7 +152,7 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
| 150 | /* Get exclusive access to that bucket */ | 152 | /* Get exclusive access to that bucket */ |
| 151 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); | 153 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); |
| 152 | size_t tor_offset; | 154 | size_t tor_offset; |
| 153 | 155 | ||
| 154 | /* For each torrent in this bucket.. */ | 156 | /* For each torrent in this bucket.. */ |
| 155 | for( tor_offset=0; tor_offset<torrents_list->size; ++tor_offset ) { | 157 | for( tor_offset=0; tor_offset<torrents_list->size; ++tor_offset ) { |
| 156 | /* Address torrents members */ | 158 | /* Address torrents members */ |
| @@ -202,8 +204,12 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
| 202 | IF_COMPRESSION( r = compress_buffer; ) | 204 | IF_COMPRESSION( r = compress_buffer; ) |
| 203 | } | 205 | } |
| 204 | 206 | ||
| 205 | /* All torrents done: release lock on currenct bucket */ | 207 | /* All torrents done: release lock on current bucket */ |
| 206 | mutex_bucket_unlock( bucket ); | 208 | mutex_bucket_unlock( bucket ); |
| 209 | |||
| 210 | /* Parent thread died? */ | ||
| 211 | if( !g_opentracker_running ) | ||
| 212 | return; | ||
| 207 | } | 213 | } |
| 208 | 214 | ||
| 209 | if( ( mode & TASK_TASK_MASK ) == TASK_FULLSCRAPE ) | 215 | if( ( mode & TASK_TASK_MASK ) == TASK_FULLSCRAPE ) |
diff --git a/ot_livesync.c b/ot_livesync.c index b447e83..f61f0ec 100644 --- a/ot_livesync.c +++ b/ot_livesync.c | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <sys/uio.h> | 8 | #include <sys/uio.h> |
| 9 | #include <string.h> | 9 | #include <string.h> |
| 10 | #include <pthread.h> | 10 | #include <pthread.h> |
| 11 | #include <unistd.h> | ||
| 11 | 12 | ||
| 12 | /* Libowfat */ | 13 | /* Libowfat */ |
| 13 | #include "socket.h" | 14 | #include "socket.h" |
| @@ -57,6 +58,11 @@ void livesync_init( ) { | |||
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | void livesync_deinit() { | 60 | void livesync_deinit() { |
| 61 | if( g_livesync_socket_in != -1 ) | ||
| 62 | close( g_livesync_socket_in ); | ||
| 63 | if( g_livesync_socket_out != -1 ) | ||
| 64 | close( g_livesync_socket_out ); | ||
| 65 | |||
| 60 | pthread_cancel( thread_id ); | 66 | pthread_cancel( thread_id ); |
| 61 | } | 67 | } |
| 62 | 68 | ||
| @@ -147,6 +153,9 @@ static void * livesync_worker( void * args ) { | |||
| 147 | ot_peer *peer = (ot_peer*)(livesync_inbuffer + off + sizeof(ot_hash)); | 153 | ot_peer *peer = (ot_peer*)(livesync_inbuffer + off + sizeof(ot_hash)); |
| 148 | ot_hash *hash = (ot_hash*)(livesync_inbuffer + off); | 154 | ot_hash *hash = (ot_hash*)(livesync_inbuffer + off); |
| 149 | 155 | ||
| 156 | if( !g_opentracker_running ) | ||
| 157 | return NULL; | ||
| 158 | |||
| 150 | if( OT_PEERFLAG(peer) & PEER_FLAG_STOPPED ) | 159 | if( OT_PEERFLAG(peer) & PEER_FLAG_STOPPED ) |
| 151 | remove_peer_from_torrent(hash, peer, NULL, FLAG_MCA); | 160 | remove_peer_from_torrent(hash, peer, NULL, FLAG_MCA); |
| 152 | else | 161 | else |
diff --git a/ot_livesync.h b/ot_livesync.h index c534f59..153dbac 100644 --- a/ot_livesync.h +++ b/ot_livesync.h | |||
| @@ -62,6 +62,7 @@ void handle_livesync( const int64 serversocket ); | |||
| 62 | 62 | ||
| 63 | /* If no syncing is required, save calling code from #ifdef | 63 | /* If no syncing is required, save calling code from #ifdef |
| 64 | constructions */ | 64 | constructions */ |
| 65 | #define livesync_deinit() | ||
| 65 | #define livesync_init() | 66 | #define livesync_init() |
| 66 | #define livesync_ticker() | 67 | #define livesync_ticker() |
| 67 | #define handle_livesync(a) | 68 | #define handle_livesync(a) |
| @@ -188,6 +188,8 @@ size_t stats_top10_txt( char * reply ) { | |||
| 188 | } | 188 | } |
| 189 | } | 189 | } |
| 190 | mutex_bucket_unlock( bucket ); | 190 | mutex_bucket_unlock( bucket ); |
| 191 | if( !g_opentracker_running ) | ||
| 192 | return 0; | ||
| 191 | } | 193 | } |
| 192 | 194 | ||
| 193 | r += sprintf( r, "Top 10 torrents by peers:\n" ); | 195 | r += sprintf( r, "Top 10 torrents by peers:\n" ); |
| @@ -250,6 +252,8 @@ static size_t stats_slash24s_txt( char * reply, size_t amount, uint32_t thresh ) | |||
| 250 | } | 252 | } |
| 251 | } | 253 | } |
| 252 | mutex_bucket_unlock( bucket ); | 254 | mutex_bucket_unlock( bucket ); |
| 255 | if( !g_opentracker_running ) | ||
| 256 | goto bailout_cleanup; | ||
| 253 | } | 257 | } |
| 254 | #endif | 258 | #endif |
| 255 | 259 | ||
| @@ -381,6 +385,8 @@ static size_t stats_peers_mrtg( char * reply ) { | |||
| 381 | peer_count += peer_list->peer_count; seed_count += peer_list->seed_count; | 385 | peer_count += peer_list->peer_count; seed_count += peer_list->seed_count; |
| 382 | } | 386 | } |
| 383 | mutex_bucket_unlock( bucket ); | 387 | mutex_bucket_unlock( bucket ); |
| 388 | if( !g_opentracker_running ) | ||
| 389 | return 0; | ||
| 384 | } | 390 | } |
| 385 | return sprintf( reply, "%zd\n%zd\nopentracker serving %zd torrents\nopentracker", | 391 | return sprintf( reply, "%zd\n%zd\nopentracker serving %zd torrents\nopentracker", |
| 386 | peer_count, | 392 | peer_count, |
| @@ -399,6 +405,8 @@ static size_t stats_startstop_mrtg( char * reply ) | |||
| 399 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); | 405 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); |
| 400 | torrent_count += torrents_list->size; | 406 | torrent_count += torrents_list->size; |
| 401 | mutex_bucket_unlock( bucket ); | 407 | mutex_bucket_unlock( bucket ); |
| 408 | if( !g_opentracker_running ) | ||
| 409 | return 0; | ||
| 402 | } | 410 | } |
| 403 | 411 | ||
| 404 | return sprintf( reply, "%zd\n%zd\nopentracker handling %zd torrents\nopentracker", | 412 | return sprintf( reply, "%zd\n%zd\nopentracker handling %zd torrents\nopentracker", |
| @@ -422,6 +430,8 @@ static size_t stats_toraddrem_mrtg( char * reply ) | |||
| 422 | peer_count += peer_list->peer_count; | 430 | peer_count += peer_list->peer_count; |
| 423 | } | 431 | } |
| 424 | mutex_bucket_unlock( bucket ); | 432 | mutex_bucket_unlock( bucket ); |
| 433 | if( !g_opentracker_running ) | ||
| 434 | return 0; | ||
| 425 | } | 435 | } |
| 426 | 436 | ||
| 427 | return sprintf( reply, "%zd\n%zd\nopentracker handling %zd peers\nopentracker", | 437 | return sprintf( reply, "%zd\n%zd\nopentracker handling %zd peers\nopentracker", |
diff --git a/trackerlogic.c b/trackerlogic.c index d7fca69..9366cd1 100644 --- a/trackerlogic.c +++ b/trackerlogic.c | |||
| @@ -376,13 +376,6 @@ void trackerlogic_deinit( void ) { | |||
| 376 | int bucket; | 376 | int bucket; |
| 377 | size_t j; | 377 | size_t j; |
| 378 | 378 | ||
| 379 | /* Deinitialise background worker threads */ | ||
| 380 | stats_deinit( ); | ||
| 381 | livesync_init( ); | ||
| 382 | accesslist_init( ); | ||
| 383 | fullscrape_deinit( ); | ||
| 384 | clean_deinit( ); | ||
| 385 | |||
| 386 | /* Free all torrents... */ | 379 | /* Free all torrents... */ |
| 387 | for(bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) { | 380 | for(bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) { |
| 388 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); | 381 | ot_vector *torrents_list = mutex_bucket_lock( bucket ); |
| @@ -396,6 +389,12 @@ void trackerlogic_deinit( void ) { | |||
| 396 | mutex_bucket_unlock( bucket ); | 389 | mutex_bucket_unlock( bucket ); |
| 397 | } | 390 | } |
| 398 | 391 | ||
| 392 | /* Deinitialise background worker threads */ | ||
| 393 | stats_deinit( ); | ||
| 394 | livesync_deinit( ); | ||
| 395 | accesslist_deinit( ); | ||
| 396 | fullscrape_deinit( ); | ||
| 397 | clean_deinit( ); | ||
| 399 | /* Release mutexes */ | 398 | /* Release mutexes */ |
| 400 | mutex_deinit( ); | 399 | mutex_deinit( ); |
| 401 | } | 400 | } |
diff --git a/trackerlogic.h b/trackerlogic.h index 1705928..c7e2e97 100644 --- a/trackerlogic.h +++ b/trackerlogic.h | |||
| @@ -50,6 +50,7 @@ typedef time_t ot_time; | |||
| 50 | 50 | ||
| 51 | /* From opentracker.c */ | 51 | /* From opentracker.c */ |
| 52 | extern time_t g_now_seconds; | 52 | extern time_t g_now_seconds; |
| 53 | extern volatile int g_opentracker_running; | ||
| 53 | #define g_now_minutes (g_now_seconds/60) | 54 | #define g_now_minutes (g_now_seconds/60) |
| 54 | 55 | ||
| 55 | extern uint32_t g_tracker_id; | 56 | extern uint32_t g_tracker_id; |
