summaryrefslogtreecommitdiffstats
path: root/src/shared/signal.c
diff options
context:
space:
mode:
authorSimon Rettberg2015-11-21 12:24:21 +0100
committerSimon Rettberg2015-11-21 12:24:21 +0100
commit4c94cb861dfbfe2a8c9c165165cbdbc062eaa39b (patch)
tree5ef29b28a920626b572a0d6dd378440ddb7f885b /src/shared/signal.c
parent[SERVER] Improve image related locking (diff)
downloaddnbd3-4c94cb861dfbfe2a8c9c165165cbdbc062eaa39b.tar.gz
dnbd3-4c94cb861dfbfe2a8c9c165165cbdbc062eaa39b.tar.xz
dnbd3-4c94cb861dfbfe2a8c9c165165cbdbc062eaa39b.zip
[FUSE] Start refactoring so we can handle multithread fuse
Diffstat (limited to 'src/shared/signal.c')
-rw-r--r--src/shared/signal.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/shared/signal.c b/src/shared/signal.c
new file mode 100644
index 0000000..a0697f8
--- /dev/null
+++ b/src/shared/signal.c
@@ -0,0 +1,52 @@
+#include "signal.h"
+#include <sys/eventfd.h>
+#include <poll.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <unistd.h>
+
+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;
+ static uint64_t one = 1;
+ return write( signalFd, &one, sizeof one ) == sizeof one;
+}
+
+int signal_wait(int signalFd, int timeoutMs)
+{
+ struct pollfd ps = {
+ .fd = signalFd,
+ .events = POLLIN
+ };
+ int ret = poll( &ps, 1, timeoutMs );
+ if ( ret == 0 ) return SIGNAL_TIMEOUT;
+ if ( ret == -1 ) return SIGNAL_ERROR;
+ if ( ps.revents & ( POLLERR | POLLNVAL ) ) return SIGNAL_ERROR;
+ return signal_clear( signalFd );
+}
+
+int signal_clear(int signalFd)
+{
+ uint64_t ret;
+ if ( read( signalFd, &ret, sizeof ret ) != sizeof ret ) {
+ if ( errno == EAGAIN ) return 0;
+ return SIGNAL_ERROR;
+ }
+ return (int)ret;
+}
+
+void signal_close(int signalFd)
+{
+ close( signalFd );
+}
+