mirror of
				git://erdgeist.org/opentracker
				synced 2025-11-01 02:13:24 +08:00 
			
		
		
		
	Use a self pipe to wake from io_wait when a thread finished his work.
This commit is contained in:
		
							parent
							
								
									66c906d5d3
								
							
						
					
					
						commit
						f12fa4c362
					
				| @ -38,6 +38,7 @@ time_t       g_now_seconds; | |||||||
| char *       g_redirecturl = NULL; | char *       g_redirecturl = NULL; | ||||||
| uint32_t     g_tracker_id; | uint32_t     g_tracker_id; | ||||||
| volatile int g_opentracker_running = 1; | volatile int g_opentracker_running = 1; | ||||||
|  | int          g_self_pipe[2]; | ||||||
| 
 | 
 | ||||||
| static char * g_serverdir = NULL; | static char * g_serverdir = NULL; | ||||||
| 
 | 
 | ||||||
| @ -216,6 +217,8 @@ static void server_mainloop( ) { | |||||||
|         handle_accept( sock ); |         handle_accept( sock ); | ||||||
|       else if( (intptr_t)cookie == FLAG_UDP ) |       else if( (intptr_t)cookie == FLAG_UDP ) | ||||||
|         handle_udp6( sock, &ws ); |         handle_udp6( sock, &ws ); | ||||||
|  |       else if( (intptr_t)cookie == FLAG_SELFPIPE ) { printf( "woke up\n" ); | ||||||
|  |       io_tryread( sock, ws.inbuf, G_INBUF_SIZE ); } | ||||||
|       else |       else | ||||||
|         handle_read( sock, &ws ); |         handle_read( sock, &ws ); | ||||||
|     } |     } | ||||||
| @ -500,6 +503,15 @@ while( scanon ) { | |||||||
| 
 | 
 | ||||||
|   g_now_seconds = time( NULL ); |   g_now_seconds = time( NULL ); | ||||||
| 
 | 
 | ||||||
|  |   /* Create our self pipe which allows us to interrupt mainloops
 | ||||||
|  |      io_wait in case some data is available to send out */ | ||||||
|  |   if( pipe( g_self_pipe ) == -1 ) | ||||||
|  |     panic( "selfpipe failed: " ); | ||||||
|  |   if( !io_fd( g_self_pipe[0] ) ) | ||||||
|  |     panic( "selfpipe io_fd failed: " ); | ||||||
|  |   io_setcookie( g_self_pipe[0], (void*)FLAG_SELFPIPE ); | ||||||
|  |   io_wantread( g_self_pipe[0] ); | ||||||
|  | 
 | ||||||
|   /* Init all sub systems. This call may fail with an exit() */ |   /* Init all sub systems. This call may fail with an exit() */ | ||||||
|   trackerlogic_init( ); |   trackerlogic_init( ); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,6 +32,9 @@ static int bucket_locklist_count = 0; | |||||||
| static pthread_mutex_t bucket_mutex; | static pthread_mutex_t bucket_mutex; | ||||||
| static pthread_cond_t bucket_being_unlocked; | static pthread_cond_t bucket_being_unlocked; | ||||||
| 
 | 
 | ||||||
|  | /* Self pipe from opentracker.c */ | ||||||
|  | extern int g_self_pipe[2]; | ||||||
|  | 
 | ||||||
| static int bucket_check( int bucket ) { | static int bucket_check( int bucket ) { | ||||||
|   /* C should come with auto-i ;) */ |   /* C should come with auto-i ;) */ | ||||||
|   int i; |   int i; | ||||||
| @ -255,6 +258,8 @@ void mutex_workqueue_pushsuccess( ot_taskid taskid ) { | |||||||
| 
 | 
 | ||||||
| int mutex_workqueue_pushresult( ot_taskid taskid, int iovec_entries, struct iovec *iovec ) { | int mutex_workqueue_pushresult( ot_taskid taskid, int iovec_entries, struct iovec *iovec ) { | ||||||
|   struct ot_task * task; |   struct ot_task * task; | ||||||
|  |   const char byte = 'o'; | ||||||
|  | 
 | ||||||
|   /* Want exclusive access to tasklist */ |   /* Want exclusive access to tasklist */ | ||||||
|   MTX_DBG( "pushresult locks.\n" ); |   MTX_DBG( "pushresult locks.\n" ); | ||||||
|   pthread_mutex_lock( &tasklist_mutex ); |   pthread_mutex_lock( &tasklist_mutex ); | ||||||
| @ -275,6 +280,8 @@ int mutex_workqueue_pushresult( ot_taskid taskid, int iovec_entries, struct iove | |||||||
|   pthread_mutex_unlock( &tasklist_mutex ); |   pthread_mutex_unlock( &tasklist_mutex ); | ||||||
|   MTX_DBG( "pushresult unlocked.\n" ); |   MTX_DBG( "pushresult unlocked.\n" ); | ||||||
| 
 | 
 | ||||||
|  |   io_trywrite( g_self_pipe[1], &byte, 1 ); | ||||||
|  | 
 | ||||||
|   /* Indicate whether the worker has to throw away results */ |   /* Indicate whether the worker has to throw away results */ | ||||||
|   return task ? 0 : -1; |   return task ? 0 : -1; | ||||||
| } | } | ||||||
|  | |||||||
| @ -56,7 +56,7 @@ extern volatile int g_opentracker_running; | |||||||
| #define       g_now_minutes (g_now_seconds/60) | #define       g_now_minutes (g_now_seconds/60) | ||||||
| 
 | 
 | ||||||
| extern uint32_t g_tracker_id; | extern uint32_t g_tracker_id; | ||||||
| typedef enum { FLAG_TCP, FLAG_UDP, FLAG_MCA } PROTO_FLAG; | typedef enum { FLAG_TCP, FLAG_UDP, FLAG_MCA, FLAG_SELFPIPE } PROTO_FLAG; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|   uint8_t data[OT_IP_SIZE+2+2]; |   uint8_t data[OT_IP_SIZE+2+2]; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 erdgeist
						erdgeist