char * g_redirecturl = NULL;
uint32_t g_tracker_id;
volatile int g_opentracker_running = 1;
+int g_self_pipe[2];
static char * g_serverdir = NULL;
handle_accept( sock );
else if( (intptr_t)cookie == FLAG_UDP )
handle_udp6( sock, &ws );
+ else if( (intptr_t)cookie == FLAG_SELFPIPE ) { printf( "woke up\n" );
+ io_tryread( sock, ws.inbuf, G_INBUF_SIZE ); }
else
handle_read( sock, &ws );
}
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() */
trackerlogic_init( );
static pthread_mutex_t bucket_mutex;
static pthread_cond_t bucket_being_unlocked;
+/* Self pipe from opentracker.c */
+extern int g_self_pipe[2];
+
static int bucket_check( int bucket ) {
/* C should come with auto-i ;) */
int i;
int mutex_workqueue_pushresult( ot_taskid taskid, int iovec_entries, struct iovec *iovec ) {
struct ot_task * task;
+ const char byte = 'o';
+
/* Want exclusive access to tasklist */
MTX_DBG( "pushresult locks.\n" );
pthread_mutex_lock( &tasklist_mutex );
pthread_mutex_unlock( &tasklist_mutex );
MTX_DBG( "pushresult unlocked.\n" );
+ io_trywrite( g_self_pipe[1], &byte, 1 );
+
/* Indicate whether the worker has to throw away results */
return task ? 0 : -1;
}
#define g_now_minutes (g_now_seconds/60)
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 {
uint8_t data[OT_IP_SIZE+2+2];