diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/usocket.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/usocket.c b/src/usocket.c index 2143c7d..c1ab725 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | /*-------------------------------------------------------------------------*\ | 16 | /*-------------------------------------------------------------------------*\ |
| 17 | * Wait for readable/writable/connected socket with timeout | 17 | * Wait for readable/writable/connected socket with timeout |
| 18 | \*-------------------------------------------------------------------------*/ | 18 | \*-------------------------------------------------------------------------*/ |
| 19 | #ifndef SOCK_SELECT | 19 | #ifdef SOCK_POLL |
| 20 | #include <sys/poll.h> | 20 | #include <sys/poll.h> |
| 21 | 21 | ||
| 22 | #define WAITFD_R POLLIN | 22 | #define WAITFD_R POLLIN |
| @@ -29,8 +29,10 @@ static int sock_waitfd(int fd, int sw, p_tm tm) { | |||
| 29 | pfd.events = sw; | 29 | pfd.events = sw; |
| 30 | pfd.revents = 0; | 30 | pfd.revents = 0; |
| 31 | if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ | 31 | if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ |
| 32 | do ret = poll(&pfd, 1, (int)(tm_getretry(tm)*1e3)); | 32 | do { |
| 33 | while (ret == -1 && errno == EINTR); | 33 | int t = (int)(tm_getretry(tm)*1e3); |
| 34 | ret = poll(&pfd, 1, t >= 0? t: -1); | ||
| 35 | } while (ret == -1 && errno == EINTR); | ||
| 34 | if (ret == -1) return errno; | 36 | if (ret == -1) return errno; |
| 35 | if (ret == 0) return IO_TIMEOUT; | 37 | if (ret == 0) return IO_TIMEOUT; |
| 36 | if (sw == WAITFD_C && (pfd.revents & (POLLIN|POLLERR))) return IO_CLOSED; | 38 | if (sw == WAITFD_C && (pfd.revents & (POLLIN|POLLERR))) return IO_CLOSED; |
