gitignore [ci skip]
[awesomized/libmemcached] / libmemcached / io.cc
index 8796d5034b8a2dd82927443662e32918579dab58..d2196f67d1e6524a0585f9999e2dca2facfb35e4 100644 (file)
@@ -70,7 +70,6 @@ static bool repack_input_buffer(memcached_instance_st* instance)
    */
     memmove(instance->read_buffer, instance->read_ptr, instance->read_buffer_length);
     instance->read_ptr= instance->read_buffer;
-    instance->read_data_length= instance->read_buffer_length;
   }
 
   /* There is room in the buffer, try to fill it! */
@@ -80,8 +79,8 @@ static bool repack_input_buffer(memcached_instance_st* instance)
       /* Just try a single read to grab what's available */
       ssize_t nr;
       if ((nr= ::recv(instance->fd,
-                      instance->read_ptr + instance->read_data_length,
-                      MEMCACHED_MAX_BUFFER - instance->read_data_length,
+                      instance->read_ptr + instance->read_buffer_length,
+                      MEMCACHED_MAX_BUFFER - instance->read_buffer_length,
                       MSG_NOSIGNAL)) <= 0)
       {
         if (nr == 0)
@@ -113,7 +112,6 @@ static bool repack_input_buffer(memcached_instance_st* instance)
       }
       else // We read data, append to our read buffer
       {
-        instance->read_data_length+= size_t(nr);
         instance->read_buffer_length+= size_t(nr);
 
         return true;
@@ -273,9 +271,11 @@ static memcached_return_t io_wait(memcached_instance_st* instance,
     case EFAULT:
     case ENOMEM:
       memcached_set_error(*instance, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
+      break;
 
     case EINVAL:
       memcached_set_error(*instance, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
+      break;
 
     default:
       memcached_set_errno(*instance, local_errno, MEMCACHED_AT, memcached_literal_param("poll"));
@@ -342,6 +342,7 @@ static bool io_flush(memcached_instance_st* instance,
     }
 
     ssize_t sent_length= ::send(instance->fd, local_write_ptr, write_length, flags);
+    int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno
 
     if (sent_length == SOCKET_ERROR)
     {
@@ -381,14 +382,14 @@ static bool io_flush(memcached_instance_st* instance,
           }
 
           memcached_quit_server(instance, true);
-          error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+          error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
           return false;
         }
       case ENOTCONN:
       case EPIPE:
       default:
         memcached_quit_server(instance, true);
-        error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+        error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
         WATCHPOINT_ASSERT(instance->fd == INVALID_SOCKET);
         return false;
       }
@@ -422,6 +423,8 @@ static memcached_return_t _io_fill(memcached_instance_st* instance)
   do
   {
     data_read= ::recv(instance->fd, instance->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL);
+    int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno
+
     if (data_read == SOCKET_ERROR)
     {
       switch (get_socket_errno())
@@ -455,12 +458,13 @@ static memcached_return_t _io_fill(memcached_instance_st* instance)
         WATCHPOINT_ASSERT(0);
       case EBADF:
         assert_msg(instance->fd != INVALID_SOCKET, "Programmer error, invalid socket");
+        /* fall through */
       case EINVAL:
       case EFAULT:
       case ECONNREFUSED:
       default:
         memcached_quit_server(instance, true);
-        memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+        memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
         break;
       }
 
@@ -485,7 +489,6 @@ static memcached_return_t _io_fill(memcached_instance_st* instance)
   } while (data_read <= 0);
 
   instance->io_bytes_sent= 0;
-  instance->read_data_length= (size_t) data_read;
   instance->read_buffer_length= (size_t) data_read;
   instance->read_ptr= instance->read_buffer;
 
@@ -589,6 +592,7 @@ memcached_return_t memcached_io_slurp(memcached_instance_st* instance)
         assert(0);
       case EBADF:
         assert_msg(instance->fd != INVALID_SOCKET, "Invalid socket state");
+        /* fall through */
       case EINVAL:
       case EFAULT:
       case ECONNREFUSED: