Use a self pipe to wake from io_wait when a thread finished his work.

dynamic-accesslists
erdgeist 16 years ago
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…
Cancel
Save