diff options
author | Volker Lendecke <vl@samba.org> | 2011-02-08 17:28:27 +0100 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2011-02-28 16:40:19 +0100 |
commit | 83becbe369bcf3478063662fc2626ccbf4530b20 (patch) | |
tree | 0d16172a640f5d5f66ca64da21a9b7b08deb77dc /lib/util/select.c | |
parent | 81bdaafab34995522fc9a7b16fcabf9cd09cb528 (diff) | |
download | samba-83becbe369bcf3478063662fc2626ccbf4530b20.tar.gz |
s3: Add sys_poll_intr
Diffstat (limited to 'lib/util/select.c')
-rw-r--r-- | lib/util/select.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/util/select.c b/lib/util/select.c index b40538c473e..5f1c91cff62 100644 --- a/lib/util/select.c +++ b/lib/util/select.c @@ -286,3 +286,29 @@ int sys_poll(struct pollfd *fds, int num_fds, int timeout) return ret; } + +int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout) +{ + int orig_timeout = timeout; + struct timespec start; + int ret; + + clock_gettime_mono(&start); + + while (true) { + struct timespec now; + int64_t elapsed; + + ret = poll(fds, num_fds, timeout); + if (ret != -1) { + break; + } + if (errno != EINTR) { + break; + } + clock_gettime_mono(&now); + elapsed = nsec_time_diff(&now, &start); + timeout = (orig_timeout - elapsed) / 1000000; + }; + return ret; +} |