Backed out changeset 74a1c5ce90d4
authorTrond Norbye <trond.norbye@sun.com>
Thu, 26 Mar 2009 14:53:19 +0000 (15:53 +0100)
committerTrond Norbye <trond.norbye@sun.com>
Thu, 26 Mar 2009 14:53:19 +0000 (15:53 +0100)
There seems to be a problem with with using freed memory..

libmemcached/Makefile.am
libmemcached/memcached_fetch.c
libmemcached/memcached_fetch_execute.c [new file with mode: 0644]

index 9b1f00c82ac19c6a8769bcfab49baebba79e1c65..74a5bbe2e5a81e5c0b0d6bb8ef1de0e0e64e52ba 100644 (file)
@@ -39,6 +39,7 @@ libmemcached_la_SOURCES = crc.c \
                          memcached_delete.c \
                          memcached_do.c \
                          memcached_fetch.c \
+                         memcached_fetch_execute.c \
                          memcached_flush.c \
                          memcached_get.c \
                          memcached_hash.c \
index 28e84ed903c6c1dbef622399bda481aab2cc278a..7f8a6b52ba622e0f0a5e3f39edc453d7656635eb 100644 (file)
@@ -14,28 +14,51 @@ char *memcached_fetch(memcached_st *ptr, char *key, size_t *key_length,
     return NULL;
   }
 
-  result_buffer= memcached_fetch_result(ptr, result_buffer, error);
-
-  if (*error != MEMCACHED_SUCCESS)
+  while (ptr->cursor_server < ptr->number_of_hosts)
   {
-    *value_length= 0;
-    return NULL;
-  }
+    char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
 
-  *value_length= memcached_string_length(&result_buffer->value);
+    if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0)
+    {
+      ptr->cursor_server++;
+      continue;
+    }
 
-  if (key)
-  {
-    strncpy(key, result_buffer->key, result_buffer->key_length);
-    *key_length= result_buffer->key_length;
-  }
+  *error= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result_buffer);
 
-  if (result_buffer->flags)
-    *flags= result_buffer->flags;
-  else
-    *flags= 0;
+    if (*error == MEMCACHED_END) /* END means that we move on to the next */
+    {
+      memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]);
+      ptr->cursor_server++;
+      continue;
+    }
+    else if (*error == MEMCACHED_SUCCESS)
+    {
+      *value_length= memcached_string_length(&result_buffer->value);
+    
+      if (key)
+      {
+        strncpy(key, result_buffer->key, result_buffer->key_length);
+        *key_length= result_buffer->key_length;
+      }
 
-  return memcached_string_c_copy(&result_buffer->value);
+      if (result_buffer->flags)
+        *flags= result_buffer->flags;
+      else
+        *flags= 0;
+
+      return  memcached_string_c_copy(&result_buffer->value);
+    }
+    else
+    {
+      *value_length= 0;
+      return NULL;
+    }
+  }
+
+  ptr->cursor_server= 0;
+  *value_length= 0;
+  return NULL;
 }
 
 memcached_result_st *memcached_fetch_result(memcached_st *ptr,
@@ -75,25 +98,3 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr,
   return NULL;
 }
 
-memcached_return memcached_fetch_execute(memcached_st *ptr, 
-                                         memcached_execute_function *callback,
-                                         void *context,
-                                         unsigned int number_of_callbacks)
-{
-  memcached_result_st *result= &ptr->result;
-  memcached_return rc;
-  unsigned int x;
-
-  while ((result= memcached_fetch_result(ptr, result, &rc)) != NULL) {
-    if (rc == MEMCACHED_SUCCESS)
-    {
-      for (x= 0; x < number_of_callbacks; x++)
-      {
-        rc= (*callback[x])(ptr, result, context);
-        if (rc != MEMCACHED_SUCCESS)
-          break;
-      }
-    }
-  }
-  return rc;
-}
diff --git a/libmemcached/memcached_fetch_execute.c b/libmemcached/memcached_fetch_execute.c
new file mode 100644 (file)
index 0000000..5058fde
--- /dev/null
@@ -0,0 +1,47 @@
+#include "common.h"
+
+memcached_return memcached_fetch_execute(memcached_st *ptr, 
+                                             memcached_execute_function *callback,
+                                             void *context,
+                                             unsigned int number_of_callbacks)
+{
+  memcached_result_st *result= &ptr->result;
+
+  while (ptr->cursor_server < ptr->number_of_hosts)
+  {
+    memcached_return rc;
+
+    char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
+
+    if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0)
+    {
+      ptr->cursor_server++;
+      continue;
+    }
+
+    rc= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result);
+
+    if (rc == MEMCACHED_END) /* END means that we move on to the next */
+    {
+      memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]);
+      ptr->cursor_server++;
+      continue;
+    }
+    else if (rc == MEMCACHED_SUCCESS)
+    {
+      unsigned int x;
+
+      for (x= 0; x < number_of_callbacks; x++)
+      {
+        memcached_return iferror;
+
+        iferror= (*callback[x])(ptr, result, context);
+
+        if (iferror != MEMCACHED_SUCCESS)
+          continue;
+      }
+    }
+  }
+
+  return MEMCACHED_SUCCESS;
+}