summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-01-09 18:08:41 +0100
committerSimon Rettberg2015-01-09 18:08:41 +0100
commiteb834c44f91410d190eedb27c731943fec1f5153 (patch)
treea1a327b37de46e914ef173fd63c31ee865baadd6
parent[SERVER] Set client connection timeout in client thread (diff)
downloaddnbd3-eb834c44f91410d190eedb27c731943fec1f5153.tar.gz
dnbd3-eb834c44f91410d190eedb27c731943fec1f5153.tar.xz
dnbd3-eb834c44f91410d190eedb27c731943fec1f5153.zip
[SERVER] Support blocking signals, saves a syscall in threadpool
-rw-r--r--src/server/signal.c5
-rw-r--r--src/server/signal.h6
-rw-r--r--src/server/threadpool.c4
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 ) {