Adding date for release
[awesomized/libmemcached] / lib / memcached_io.c
index 2c1bb14c3860df761f6011fe799bb9ebdf0d6793..299d4390659616b21ebd8a4b4b050dc6df7603ca 100644 (file)
@@ -44,10 +44,36 @@ static memcached_return io_wait(memcached_st *ptr, unsigned int server_key,
   /* Imposssible for anything other then -1 */
   WATCHPOINT_ASSERT(error == -1);
   memcached_quit_server(ptr, server_key, 1);
+
   return MEMCACHED_FAILURE;
 
 }
 
+void memcached_io_preread(memcached_st *ptr)
+{
+  unsigned int x;
+
+  return;
+
+  for (x= 0; x < ptr->number_of_hosts; x++)
+  {
+    if (memcached_server_response_count(ptr, x) &&
+        ptr->hosts[x].read_data_length < MEMCACHED_MAX_BUFFER )
+    {
+      size_t data_read;
+
+      data_read= read(ptr->hosts[x].fd,
+                      ptr->hosts[x].read_ptr + ptr->hosts[x].read_data_length,
+                      MEMCACHED_MAX_BUFFER - ptr->hosts[x].read_data_length);
+      if (data_read == -1)
+        continue;
+
+      ptr->hosts[x].read_buffer_length+= data_read;
+      ptr->hosts[x].read_data_length+= data_read;
+    }
+  }
+}
+
 ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
                           char *buffer, size_t length)
 {
@@ -57,6 +83,7 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
 
   while (length)
   {
+    uint8_t found_eof= 0;
     if (!ptr->hosts[server_key].read_buffer_length)
     {
       size_t data_read;
@@ -73,6 +100,7 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
           case EAGAIN:
             {
               memcached_return rc;
+
               rc= io_wait(ptr, server_key, MEM_READ);
 
               if (rc == MEMCACHED_SUCCESS)
@@ -91,18 +119,43 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
         }
         else if (data_read)
           break;
-        /* If zero, just keep looping */
+        /* If zero, just keep looping unless testing, then assert() */
+        else
+        {
+          WATCHPOINT_ASSERT(0);
+          found_eof= 1;
+          break;
+        }
       }
 
+      ptr->hosts[server_key].read_data_length= data_read;
       ptr->hosts[server_key].read_buffer_length= data_read;
       ptr->hosts[server_key].read_ptr= ptr->hosts[server_key].read_buffer;
     }
 
-    *buffer_ptr= *ptr->hosts[server_key].read_ptr;
-    length--;
-    ptr->hosts[server_key].read_ptr++;
-    ptr->hosts[server_key].read_buffer_length--;
-    buffer_ptr++;
+    if (length > 1)
+    {
+      size_t difference;
+
+      difference= (length > ptr->hosts[server_key].read_buffer_length) ? ptr->hosts[server_key].read_buffer_length : length;
+
+      memcpy(buffer_ptr, ptr->hosts[server_key].read_ptr, difference);
+      length -= difference;
+      ptr->hosts[server_key].read_ptr+= difference;
+      ptr->hosts[server_key].read_buffer_length-= difference;
+      buffer_ptr+= difference;
+    }
+    else
+    {
+      *buffer_ptr= *ptr->hosts[server_key].read_ptr;
+      length--;
+      ptr->hosts[server_key].read_ptr++;
+      ptr->hosts[server_key].read_buffer_length--;
+      buffer_ptr++;
+    }
+
+    if (found_eof)
+      break;
   }
 
   return (size_t)(buffer_ptr - buffer);