summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerdgeist <>2008-12-07 03:50:51 +0000
committererdgeist <>2008-12-07 03:50:51 +0000
commitc6947b160f99278057df0770b849b46264b72229 (patch)
tree8c5e543648458f7368d51906c53a9e1b45a8c364
parentad8c9ee1efac171e5f3a8f41a630254ac88357a8 (diff)
Handle program end more politely
-rw-r--r--opentracker.c8
-rw-r--r--ot_accesslist.c4
-rw-r--r--ot_accesslist.h2
-rw-r--r--ot_clean.c2
-rw-r--r--ot_fullscrape.c10
-rw-r--r--ot_livesync.c9
-rw-r--r--ot_livesync.h1
-rw-r--r--ot_stats.c10
-rw-r--r--trackerlogic.c13
-rw-r--r--trackerlogic.h1
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 */
37time_t g_now_seconds; 37time_t g_now_seconds;
38char * g_redirecturl = NULL; 38char * g_redirecturl = NULL;
39uint32_t g_tracker_id; 39uint32_t g_tracker_id;
40volatile int g_opentracker_running = 1;
40 41
41static char * g_serverdir = NULL; 42static char * g_serverdir = NULL;
42 43
@@ -51,6 +52,7 @@ static void panic( const char *routine ) {
51static void signal_handler( int s ) { 52static 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 @@
23char *g_accesslist_filename = NULL; 23char *g_accesslist_filename = NULL;
24static ot_vector accesslist; 24static ot_vector accesslist;
25 25
26static void access_list_deinit( void ) {
27 accesslist_reset( );
28}
29
26static void accesslist_reset( void ) { 30static 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
15void accesslist_init( ); 15void accesslist_init( );
16void accesslist_deinit( );
16int accesslist_hashisvalid( ot_hash *hash ); 17int accesslist_hashisvalid( ot_hash *hash );
17 18
18extern char *g_accesslist_filename; 19extern 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
diff --git a/ot_clean.c b/ot_clean.c
index 2173c27..4adeee6 100644
--- a/ot_clean.c
+++ b/ot_clean.c
@@ -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
59void livesync_deinit() { 60void 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)
diff --git a/ot_stats.c b/ot_stats.c
index f456d46..a4596c6 100644
--- a/ot_stats.c
+++ b/ot_stats.c
@@ -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 */
52extern time_t g_now_seconds; 52extern time_t g_now_seconds;
53extern 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
55extern uint32_t g_tracker_id; 56extern uint32_t g_tracker_id;