Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knu/128484 to your computer and use it in GitHub Desktop.
Save knu/128484 to your computer and use it in GitHub Desktop.
diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c
index 7bdb723..69b766e 100644
--- a/libmemcached/memcached_io.c
+++ b/libmemcached/memcached_io.c
@@ -105,28 +105,29 @@ memcached_return memcached_io_read(memcached_server_st *ptr,
while (1)
{
+ memcached_return rc;
+ if ((rc= io_wait(ptr, MEM_READ)) != MEMCACHED_SUCCESS)
+ {
+ memcached_quit_server(ptr, 1);
+ *nread= -1;
+ return rc;
+ }
+
data_read= read(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER);
if (data_read > 0)
break;
else if (data_read == -1)
{
ptr->cached_errno= errno;
- memcached_return rc= MEMCACHED_UNKNOWN_READ_FAILURE;
switch (errno)
{
case EAGAIN:
case EINTR:
- if ((rc= io_wait(ptr, MEM_READ)) == MEMCACHED_SUCCESS)
- continue;
- /* fall through */
-
- default:
- {
- memcached_quit_server(ptr, 1);
- *nread= -1;
- return rc;
- }
+ continue;
}
+ memcached_quit_server(ptr, 1);
+ *nread= -1;
+ return MEMCACHED_UNKNOWN_READ_FAILURE;
}
else
{
@@ -267,6 +268,17 @@ memcached_return memcached_io_close(memcached_server_st *ptr)
#endif
}
+ /* poll() has already been done here; close it immediately */
+ if (ptr->type != MEMCACHED_CONNECTION_UDP)
+ {
+ struct linger linger;
+
+ linger.l_onoff= 0;
+ linger.l_linger= 0;
+ setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER,
+ &linger, (socklen_t)sizeof(struct linger));
+ }
+
r= close(ptr->fd);
#ifdef HAVE_DEBUG
if (r != 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment