Moved response code to use a switch/case (instead if giant if/else)
[m6w6/libmemcached] / libmemcached / memcached_io.c
index b9261f3d9bc4ef27540f5799e702a538032aca31..47486d3095b799872a6943004c23821af525c7b9 100644 (file)
@@ -75,7 +75,7 @@ void memcached_io_preread(memcached_st *ptr)
 #endif
 
 ssize_t memcached_io_read(memcached_server_st *ptr,
-                          char *buffer, size_t length)
+                          void *buffer, size_t length)
 {
   char *buffer_ptr;
 
@@ -154,14 +154,14 @@ ssize_t memcached_io_read(memcached_server_st *ptr,
       break;
   }
 
-  return (size_t)(buffer_ptr - buffer);
+  return (size_t)(buffer_ptr - (char*)buffer);
 }
 
 ssize_t memcached_io_write(memcached_server_st *ptr,
-                           char *buffer, size_t length, char with_flush)
+                           const void *buffer, size_t length, char with_flush)
 {
   size_t original_length;
-  char* buffer_ptr;
+  const char* buffer_ptr;
 
   original_length= length;
   buffer_ptr= buffer;
@@ -206,7 +206,21 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
 
 memcached_return memcached_io_close(memcached_server_st *ptr)
 {
-  close(ptr->fd);
+  int r;
+  /* in case of death shutdown to avoid blocking at close() */
+
+  r= shutdown(ptr->fd, SHUT_RDWR);
+
+#ifdef HAVE_DEBUG
+  if (r && errno != ENOTCONN)
+  {
+    WATCHPOINT_ERRNO(errno);
+    WATCHPOINT_ASSERT(errno);
+  }
+#endif
+
+  r= close(ptr->fd);
+  WATCHPOINT_ASSERT(r == 0);
 
   return MEMCACHED_SUCCESS;
 }
@@ -214,7 +228,7 @@ memcached_return memcached_io_close(memcached_server_st *ptr)
 static ssize_t io_flush(memcached_server_st *ptr,
                         memcached_return *error)
 {
-  size_t sent_length;
+  ssize_t sent_length;
   size_t return_length;
   char *local_write_ptr= ptr->write_buffer;
   size_t write_length= ptr->write_buffer_offset;
@@ -225,9 +239,11 @@ static ssize_t io_flush(memcached_server_st *ptr,
     return 0;
 
   /* Looking for memory overflows */
+#if defined(HAVE_DEBUG)
   if (write_length == MEMCACHED_MAX_BUFFER)
     WATCHPOINT_ASSERT(ptr->write_buffer == local_write_ptr);
   WATCHPOINT_ASSERT((ptr->write_buffer + MEMCACHED_MAX_BUFFER) >= (local_write_ptr + write_length));
+#endif
 
   return_length= 0;
   while (write_length)
@@ -264,7 +280,7 @@ static ssize_t io_flush(memcached_server_st *ptr,
     }
     else
     {
-      if ((ssize_t)(sent_length= write(ptr->fd, local_write_ptr, 
+      if ((sent_length= write(ptr->fd, local_write_ptr, 
                                        write_length)) == -1)
       {
         switch (errno)