X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_io.c;h=42d9f6f98f8ca504f1ed35a30b60f50d936b0b7c;hb=bdb7897b42e740471cc02589eda4434a09bbd330;hp=ddca197260f818de70c5e04e6e60a553479f1b8e;hpb=c4b0fc53b348067c6a6e5eaf335869393cf347bf;p=m6w6%2Flibmemcached diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c index ddca1972..42d9f6f9 100644 --- a/libmemcached/memcached_io.c +++ b/libmemcached/memcached_io.c @@ -30,6 +30,7 @@ static memcached_return io_wait(memcached_server_st *ptr, fds[0].fd= ptr->fd; fds[0].events= flags; +#ifdef NOT_DONE /* ** We are going to block on write, but at least on Solaris we might block ** on write if we haven't read anything from our input buffer.. @@ -39,7 +40,11 @@ static memcached_return io_wait(memcached_server_st *ptr, ** the test. */ if (read_or_write == MEM_WRITE) - memcached_purge(ptr); + { + if (memcached_purge(ptr) != MEMCACHED_SUCCESS || memcached_purge(ptr) != MEMCACHED_STORED) + return MEMCACHED_FAILURE; + } +#endif error= poll(fds, 1, ptr->root->poll_timeout); @@ -112,6 +117,7 @@ ssize_t memcached_io_read(memcached_server_st *ptr, switch (errno) { case EAGAIN: + case EINTR: { memcached_return rc; @@ -175,6 +181,8 @@ ssize_t memcached_io_write(memcached_server_st *ptr, size_t original_length; const char* buffer_ptr; + WATCHPOINT_ASSERT(ptr->fd != -1); + original_length= length; buffer_ptr= buffer; @@ -198,6 +206,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr, memcached_return rc; ssize_t sent_length; + WATCHPOINT_ASSERT(ptr->fd != -1); sent_length= io_flush(ptr, &rc); if (sent_length == -1) return -1; @@ -209,6 +218,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr, if (with_flush) { memcached_return rc; + WATCHPOINT_ASSERT(ptr->fd != -1); if (io_flush(ptr, &rc) == -1) return -1; } @@ -219,20 +229,30 @@ ssize_t memcached_io_write(memcached_server_st *ptr, memcached_return memcached_io_close(memcached_server_st *ptr) { int r; - /* in case of death shutdown to avoid blocking at close() */ - r= shutdown(ptr->fd, SHUT_RDWR); + if (ptr->fd == -1) + return MEMCACHED_SUCCESS; + + /* in case of death shutdown to avoid blocking at close() */ + if (1) + { + r= shutdown(ptr->fd, SHUT_RDWR); #ifdef HAVE_DEBUG - if (r && errno != ENOTCONN) - { - WATCHPOINT_ERRNO(errno); - WATCHPOINT_ASSERT(errno); - } + if (r && errno != ENOTCONN) + { + WATCHPOINT_NUMBER(ptr->fd); + WATCHPOINT_ERRNO(errno); + WATCHPOINT_ASSERT(errno); + } #endif + } r= close(ptr->fd); - WATCHPOINT_ASSERT(r == 0); +#ifdef HAVE_DEBUG + if (r != 0) + WATCHPOINT_ERRNO(errno); +#endif return MEMCACHED_SUCCESS; } @@ -247,6 +267,8 @@ static ssize_t io_flush(memcached_server_st *ptr, *error= MEMCACHED_SUCCESS; + WATCHPOINT_ASSERT(ptr->fd != -1); + if (ptr->write_buffer_offset == 0) return 0; @@ -260,6 +282,7 @@ static ssize_t io_flush(memcached_server_st *ptr, return_length= 0; while (write_length) { + WATCHPOINT_ASSERT(ptr->fd != -1); WATCHPOINT_ASSERT(write_length > 0); sent_length= 0; if (ptr->type == MEMCACHED_CONNECTION_UDP) @@ -292,15 +315,25 @@ static ssize_t io_flush(memcached_server_st *ptr, } else { +#ifdef NOT_DONE /* ** We might want to purge the input buffer if we haven't consumed ** any output yet... The test for the limits is the purge is inline ** in the purge function to avoid duplicating the logic.. */ - memcached_purge(ptr); + { + memcached_return rc; + WATCHPOINT_ASSERT(ptr->fd != -1); + rc= memcached_purge(ptr); + + if (rc != MEMCACHED_SUCCESS || rc != MEMCACHED_STORED) + return -1; + } +#endif + WATCHPOINT_ASSERT(ptr->fd != -1); if ((sent_length= write(ptr->fd, local_write_ptr, - write_length)) == -1) + write_length)) == -1) { switch (errno) { @@ -334,7 +367,8 @@ static ssize_t io_flush(memcached_server_st *ptr, } WATCHPOINT_ASSERT(write_length == 0); - WATCHPOINT_ASSERT(return_length == ptr->write_buffer_offset); + // Need to study this assert() WATCHPOINT_ASSERT(return_length == + // ptr->write_buffer_offset); ptr->write_buffer_offset= 0; return return_length;