]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - fd.c
fd.c: Prefer poll(2) over select(2) for write_ok().
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index 33891d2e6c9f1c3568428b1df93b4b92e295ef61..2f3ec997c11e796fc5ff8ada46c40a662e0aef13 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -6,6 +6,7 @@
 #include <sys/types.h>
 #include <dirent.h>
 #include <sys/mman.h>
+#include <poll.h>
 
 #include "para.h"
 #include "error.h"
@@ -334,8 +335,7 @@ bool file_exists(const char *fn)
  * \param n The highest-numbered descriptor in any of the two sets, plus 1.
  * \param readfds fds that should be checked for readability.
  * \param writefds fds that should be checked for writablility.
- * \param timeout_tv upper bound on the amount of time elapsed before select()
- * returns.
+ * \param timeout Upper bound in milliseconds.
  *
  * \return The return value of the underlying select() call on success, the
  * negative system error code on errors.
@@ -343,12 +343,14 @@ bool file_exists(const char *fn)
  * All arguments are passed verbatim to select(2).
  * \sa select(2) select_tut(2).
  */
-int para_select(int n, fd_set *readfds, fd_set *writefds,
-               struct timeval *timeout_tv)
+int para_select(int n, fd_set *readfds, fd_set *writefds, int timeout)
 {
        int ret;
+       struct timeval tv;
+
+       ms2tv(timeout, &tv);
        do
-               ret = select(n, readfds, writefds, NULL, timeout_tv);
+               ret = select(n, readfds, writefds, NULL, &tv);
        while (ret < 0 && errno == EINTR);
        if (ret < 0)
                return -ERRNO_TO_PARA_ERROR(errno);
@@ -650,17 +652,17 @@ int para_munmap(void *start, size_t length)
  * \return positive if fd is ready for writing, zero if it isn't, negative if
  * an error occurred.
  */
-
 int write_ok(int fd)
 {
-       struct timeval tv;
-       fd_set wfds;
+       int ret;
+       struct pollfd pfd = {.fd = fd, .events = POLLOUT};
 
-       FD_ZERO(&wfds);
-       FD_SET(fd, &wfds);
-       tv.tv_sec = 0;
-       tv.tv_usec = 0;
-       return para_select(fd + 1, NULL, &wfds, &tv);
+       do
+               ret = poll(&pfd, 1, 0);
+       while (ret < 0 && errno == EINTR);
+       if (ret < 0)
+               return -ERRNO_TO_PARA_ERROR(errno);
+       return pfd.revents & POLLOUT;
 }
 
 /**