diff options
author | Simon Rettberg | 2015-01-09 18:08:41 +0100 |
---|---|---|
committer | Simon Rettberg | 2015-01-09 18:08:41 +0100 |
commit | eb834c44f91410d190eedb27c731943fec1f5153 (patch) | |
tree | a1a327b37de46e914ef173fd63c31ee865baadd6 /src/server | |
parent | [SERVER] Set client connection timeout in client thread (diff) | |
download | dnbd3-eb834c44f91410d190eedb27c731943fec1f5153.tar.gz dnbd3-eb834c44f91410d190eedb27c731943fec1f5153.tar.xz dnbd3-eb834c44f91410d190eedb27c731943fec1f5153.zip |
[SERVER] Support blocking signals, saves a syscall in threadpool
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/signal.c | 5 | ||||
-rw-r--r-- | src/server/signal.h | 6 | ||||
-rw-r--r-- | src/server/threadpool.c | 4 |
3 files changed, 13 insertions, 2 deletions
diff --git a/src/server/signal.c b/src/server/signal.c index 3b7d50b..a0697f8 100644 --- a/src/server/signal.c +++ b/src/server/signal.c @@ -10,6 +10,11 @@ int signal_new() return eventfd( 0, EFD_NONBLOCK ); } +int signal_newBlocking() +{ + return eventfd( 0, 0 ); +} + int signal_call(int signalFd) { if ( signalFd < 0 ) return 0; diff --git a/src/server/signal.h b/src/server/signal.h index 1bbc724..0e2f85f 100644 --- a/src/server/signal.h +++ b/src/server/signal.h @@ -12,6 +12,12 @@ int signal_new(); /** + * Create a new signal fd (eventfd), blocking. + * @return >= 0 on success, which is the fd; < 0 on error + */ +int signal_newBlocking(); + +/** * Trigger the given signal, so a wait or clear call will succeed. * @return SIGNAL_OK on success, SIGNAL_ERROR on error */ diff --git a/src/server/threadpool.c b/src/server/threadpool.c index 34e996c..fd90944 100644 --- a/src/server/threadpool.c +++ b/src/server/threadpool.c @@ -60,7 +60,7 @@ bool threadpool_run(void *(*startRoutine)(void *), void *arg) printf( "[WARNING] Could not alloc entry_t for new thread\n" ); return false; } - entry->signalFd = signal_new(); + entry->signalFd = signal_newBlocking(); if ( entry->signalFd < 0 ) { printf( "[WARNING] Could not create signalFd for new thread pool thread\n" ); free( entry ); @@ -90,7 +90,7 @@ static void *threadpool_worker(void *entryPtr) entry_t *entry = (entry_t*)entryPtr; for ( ;; ) { // Wait for signal from outside that we have work to do - int ret = signal_wait( entry->signalFd, -1 ); + int ret = signal_clear( entry->signalFd ); if ( _shutdown ) break; if ( ret > 0 ) { if ( entry->startRoutine == NULL ) { |