Merge in update/fix for connect, and setup memcached to not eject values.
[awesomized/libmemcached] / libmemcached / io.cc
index 6594aa75d13972e2a84d920c921ce4d0b225e326..c04deb30502001570333bfc82f24a94ee57d0e6b 100644 (file)
@@ -38,7 +38,6 @@
 
 
 #include <libmemcached/common.h>
-#include <cassert>
 
 enum memc_read_or_write {
   MEM_READ,
@@ -57,8 +56,6 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
   fds.fd= ptr->fd;
   fds.events= POLLIN;
 
-  int error;
-
   if (read_or_write == MEM_WRITE) /* write */
   {
     fds.events= POLLOUT;
@@ -86,18 +83,16 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
     }
   }
 
+  if (ptr->root->poll_timeout == 0) // Mimic 0 causes timeout behavior (not all platforms do this)
+  {
+    return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
+  }
+
   size_t loop_max= 5;
   while (--loop_max) // While loop is for ERESTART or EINTR
   {
-    if (ptr->root->poll_timeout) // Mimic 0 causes timeout behavior (not all platforms do this)
-    {
-      error= poll(&fds, 1, ptr->root->poll_timeout);
-    }
-    else
-    {
-      error= 0;
-    }
 
+    int error= poll(&fds, 1, ptr->root->poll_timeout);
     switch (error)
     {
     case 1: // Success!
@@ -132,11 +127,11 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
           int err;
           socklen_t len= sizeof (err);
           (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
-          ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
+          memcached_set_errno(*ptr, (err == 0) ? get_socket_errno() : err, MEMCACHED_AT);
         }
         else
         {
-          ptr->cached_errno= get_socket_errno();
+          memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
         }
         memcached_quit_server(ptr, true);
 
@@ -145,12 +140,9 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
     }
   }
 
-  /* Imposssible for anything other then -1 */
-  WATCHPOINT_ASSERT(error == -1);
-  ptr->cached_errno= get_socket_errno();
   memcached_quit_server(ptr, true);
 
-  return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT);
+  return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
 }
 
 memcached_return_t memcached_io_wait_for_write(memcached_server_write_instance_st ptr)
@@ -284,12 +276,12 @@ static bool process_input_buffer(memcached_server_write_instance_st ptr)
 memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
                                      void *buffer, size_t length, ssize_t *nread)
 {
-  assert(ptr); // Programmer error
+  assert_msg(ptr, "Programmer error, memcached_io_read() recieved an invalid memcached_server_write_instance_st"); // Programmer error
   char *buffer_ptr= static_cast<char *>(buffer);
 
   if (ptr->fd == INVALID_SOCKET)
   {
-    assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
+    assert_msg(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO), "Programmer error, invalid socket state");
     return MEMCACHED_CONNECTION_FAILURE;
   }
 
@@ -329,7 +321,7 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
           case ENOTSOCK:
             WATCHPOINT_ASSERT(0);
           case EBADF:
-            assert(ptr->fd != INVALID_SOCKET);
+            assert_msg(ptr->fd != INVALID_SOCKET, "Programmer error, invalid socket");
           case EINVAL:
           case EFAULT:
           case ECONNREFUSED:
@@ -353,7 +345,6 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
             it will return EGAIN if data is not immediatly available.
           */
           WATCHPOINT_STRING("We had a zero length recv()");
-          assert(0);
           memcached_quit_server(ptr, true);
           *nread= -1;
           return memcached_set_error(*ptr, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT);
@@ -395,11 +386,11 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
 
 memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr)
 {
-  assert(ptr); // Programmer error
+  assert_msg(ptr, "Programmer error, invalid memcached_server_write_instance_st");
 
   if (ptr->fd == INVALID_SOCKET)
   {
-    assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
+    assert_msg(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO), "Invalid socket state");
     return MEMCACHED_CONNECTION_FAILURE;
   }
 
@@ -436,7 +427,7 @@ memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr)
       case ENOTSOCK:
         WATCHPOINT_ASSERT(0);
       case EBADF:
-        assert(ptr->fd != INVALID_SOCKET);
+        assert_msg(ptr->fd != INVALID_SOCKET, "Invalid socket state");
       case EINVAL:
       case EFAULT:
       case ECONNREFUSED:
@@ -619,7 +610,8 @@ memcached_server_write_instance_st memcached_io_get_readable_server(memcached_st
     return NULL;
   }
 
-  switch (poll(fds, host_index, memc->poll_timeout))
+  int error= poll(fds, host_index, memc->poll_timeout);
+  switch (error)
   {
   case -1:
     memcached_set_errno(*memc, get_socket_errno(), MEMCACHED_AT);
@@ -716,7 +708,7 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr,
 
     if (sent_length == SOCKET_ERROR)
     {
-      ptr->cached_errno= get_socket_errno();
+      memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
 #if 0 // @todo I should look at why we hit this bit of code hard frequently
       WATCHPOINT_ERRNO(get_socket_errno());
       WATCHPOINT_NUMBER(get_socket_errno());