summaryrefslogtreecommitdiffstats
path: root/src/server/altservers.c
diff options
context:
space:
mode:
authorSimon Rettberg2016-02-05 15:05:30 +0100
committerSimon Rettberg2016-02-05 15:05:30 +0100
commit627645acc074eab7a3694a267bc2a643d8b3e57a (patch)
tree5f61225803c369ab1295ce0ee36a33ae6cb51eb8 /src/server/altservers.c
parent[SERVER] BREAKING: Get rid of pseudo case-insensitivity (diff)
downloaddnbd3-627645acc074eab7a3694a267bc2a643d8b3e57a.tar.gz
dnbd3-627645acc074eab7a3694a267bc2a643d8b3e57a.tar.xz
dnbd3-627645acc074eab7a3694a267bc2a643d8b3e57a.zip
First steps in make signals more abstract from the underlying mechanism; replace epoll with poll.
We now don't assume that a signal equals a single fd (eventfd on Linux). The next step would be to create a version of signal.c that uses a pipe internally, so it can be used on other platforms, like *BSD. This is also the reason epoll was replaced with poll in uplink.c
Diffstat (limited to 'src/server/altservers.c')
-rw-r--r--src/server/altservers.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/server/altservers.c b/src/server/altservers.c
index e4a7dca..4ebf2f6 100644
--- a/src/server/altservers.c
+++ b/src/server/altservers.c
@@ -21,7 +21,7 @@
static dnbd3_connection_t *pending[SERVER_MAX_PENDING_ALT_CHECKS];
static pthread_spinlock_t pendingLockWrite; // Lock for adding something to pending. (NULL -> nonNULL)
static pthread_mutex_t pendingLockConsume = PTHREAD_MUTEX_INITIALIZER; // Lock for removing something (nonNULL -> NULL)
-static int signalFd = -1;
+static dnbd3_signal_t* runSignal = NULL;
static dnbd3_alt_server_t altServers[SERVER_MAX_ALTS];
static int numAltServers = 0;
@@ -53,7 +53,7 @@ void altservers_init()
void altservers_shutdown()
{
if ( !initDone ) return;
- signal_call( signalFd ); // Wake altservers thread up
+ signal_call( runSignal ); // Wake altservers thread up
thread_join( altThread, NULL );
}
@@ -154,7 +154,7 @@ void altservers_findUplink(dnbd3_connection_t *uplink)
pending[i] = uplink;
uplink->rttTestResult = RTT_INPROGRESS;
spin_unlock( &pendingLockWrite );
- signal_call( signalFd ); // Wake altservers thread up
+ signal_call( runSignal ); // Wake altservers thread up
return;
}
// End of loop - no free slot
@@ -365,16 +365,16 @@ static void *altservers_main(void *data UNUSED)
for (int i = 0; i < SERVER_MAX_PENDING_ALT_CHECKS; ++i)
pending[i] = NULL;
spin_unlock( &pendingLockWrite );
- // Init signal-pipe
- signalFd = signal_new();
- if ( signalFd < 0 ) {
+ // Init signal
+ runSignal = signal_new();
+ if ( runSignal == NULL ) {
logadd( LOG_WARNING, "error creating signal object. Uplink feature unavailable." );
goto cleanup;
}
// LOOP
while ( !_shutdown ) {
// Wait 5 seconds max.
- ret = signal_wait( signalFd, 5000 );
+ ret = signal_wait( runSignal, 5000 );
if ( _shutdown ) goto cleanup;
if ( ret == SIGNAL_ERROR ) {
if ( errno == EAGAIN || errno == EINTR ) continue;
@@ -511,8 +511,7 @@ static void *altservers_main(void *data UNUSED)
uplink->betterServer = servers[bestIndex];
uplink->rttTestResult = RTT_DOCHANGE;
spin_unlock( &uplink->rttLock );
- static uint64_t counter = 1;
- write( uplink->signal, &counter, sizeof(counter) );
+ signal_call( uplink->signal );
} else if (bestSock == -1) {
// No server was reachable
spin_lock( &uplink->rttLock );
@@ -540,8 +539,8 @@ static void *altservers_main(void *data UNUSED)
}
}
cleanup: ;
- if ( signalFd != -1 ) signal_close( signalFd );
- signalFd = -1;
+ if ( runSignal != NULL ) signal_close( runSignal );
+ runSignal = NULL;
return NULL ;
}