X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_io.c;h=77541e2ad9d3463e013553a5bc8ed344ef0d61e2;hb=a6fa1b62336cfddaf0d9efb7f431490a7c2f3ac9;hp=54a4b8dcd16d6c154604349533c03c9a067942e0;hpb=2c7a6aaf4a69aab11206078afcd3355271ddf128;p=awesomized%2Flibmemcached diff --git a/lib/memcached_io.c b/lib/memcached_io.c index 54a4b8dc..77541e2a 100644 --- a/lib/memcached_io.c +++ b/lib/memcached_io.c @@ -5,6 +5,27 @@ #include "common.h" #include "memcached_io.h" #include +#include + +int io_wait(memcached_st *ptr, unsigned int server_key, unsigned read_or_write) +{ + struct pollfd fds[1]; + short flags= 0; + + if (read_or_write) + flags= POLLOUT | POLLERR; + else + flags= POLLIN | POLLERR; + + memset(&fds, 0, sizeof(struct pollfd)); + fds[0].fd= ptr->hosts[server_key].fd; + fds[0].events= flags; + + if (poll(fds, 1, -1) < 0) + return MEMCACHED_FAILURE; + + return MEMCACHED_SUCCESS; +} ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, char *buffer, size_t length) @@ -23,30 +44,11 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, { if (ptr->flags & MEM_NO_BLOCK) { - while (1) - { - int select_return; - struct timeval local_tv; - fd_set set; - - memset(&local_tv, 0, sizeof(struct timeval)); - - local_tv.tv_sec= 0; - local_tv.tv_usec= 300; - - FD_ZERO(&set); - FD_SET(ptr->hosts[server_key].fd, &set); + memcached_return rc; - select_return= select(1, &set, NULL, NULL, &local_tv); - - if (select_return == -1) - { - ptr->my_errno= errno; - return -1; - } - else if (!select_return) - break; - } + rc= io_wait(ptr, server_key, 0); + if (rc != MEMCACHED_SUCCESS) + return -1; } data_read= recv(ptr->hosts[server_key].fd, @@ -128,38 +130,16 @@ ssize_t memcached_io_flush(memcached_st *ptr, unsigned int server_key) { if (ptr->flags & MEM_NO_BLOCK) { + memcached_return rc; - while (1) - { - struct timeval local_tv; - fd_set set; - int select_return; - - local_tv.tv_sec= 0; - local_tv.tv_usec= 300 * loop; - - FD_ZERO(&set); - FD_SET(ptr->hosts[server_key].fd, &set); - - select_return= select(1, NULL, &set, NULL, &local_tv); - - if (select_return == -1) - { - ptr->my_errno= errno; - return -1; - } - else if (!select_return) - break; - } + rc= io_wait(ptr, server_key, 1); + if (rc != MEMCACHED_SUCCESS) + return -1; } sent_length= 0; -#ifdef orig - if ((sent_length= send(ptr->hosts[server_key].fd, write_ptr, - write_length, 0)) == -1) -#endif - if ((sent_length= write(ptr->hosts[server_key].fd, write_ptr, - write_length)) == -1) + if ((sent_length= write(ptr->hosts[server_key].fd, write_ptr, + write_length)) == -1) { switch (errno) {