diff options
author | Simon Rettberg | 2014-12-31 17:19:20 +0100 |
---|---|---|
committer | Simon Rettberg | 2014-12-31 17:19:20 +0100 |
commit | 7b8e3ffcbccf6d02bfcb0c9c9c2d259362357fb8 (patch) | |
tree | 80dd759e320ff74bc8bb56fb9a9858c57f99320a /src/server/signal.c | |
parent | [SERVER] Add setting to enable/disable background replication, add comments t... (diff) | |
download | dnbd3-7b8e3ffcbccf6d02bfcb0c9c9c2d259362357fb8.tar.gz dnbd3-7b8e3ffcbccf6d02bfcb0c9c9c2d259362357fb8.tar.xz dnbd3-7b8e3ffcbccf6d02bfcb0c9c9c2d259362357fb8.zip |
[SERVER] Create compilation unit for wait/signalling logic (using eventfd)
Diffstat (limited to 'src/server/signal.c')
-rw-r--r-- | src/server/signal.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/server/signal.c b/src/server/signal.c new file mode 100644 index 0000000..f0988b9 --- /dev/null +++ b/src/server/signal.c @@ -0,0 +1,46 @@ +#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_call(int signalFd) +{ + 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 ); +} + |