Spec fix.
[m6w6/libmemcached] / libmemcached / memcached.c
index 2fa4f42ce940cd4a19dd369851d0bc78d80eff86..38468fb9a6a5a83648a654ef3ad7ac428b6ed638 100644 (file)
@@ -5,8 +5,6 @@
 
 memcached_st *memcached_create(memcached_st *ptr)
 {
-  memcached_result_st *result_ptr;
-
   if (ptr == NULL)
   {
     ptr= (memcached_st *)calloc(1, sizeof(memcached_st));
@@ -27,8 +25,11 @@ memcached_st *memcached_create(memcached_st *ptr)
 
   memcached_set_memory_allocators(ptr, NULL, NULL, NULL, NULL);
 
-  result_ptr= memcached_result_create(ptr, &ptr->result);
-  WATCHPOINT_ASSERT(result_ptr);
+  if (! memcached_result_create(ptr, &ptr->result))
+  {
+    memcached_free(ptr);
+    return NULL;
+  }
   ptr->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
   ptr->connect_timeout= MEMCACHED_DEFAULT_TIMEOUT;
   ptr->retry_timeout= 0;
@@ -43,6 +44,42 @@ memcached_st *memcached_create(memcached_st *ptr)
   return ptr;
 }
 
+void server_list_free(memcached_st *ptr, memcached_server_st *servers)
+{
+  uint32_t x;
+
+  if (servers == NULL)
+    return;
+
+  for (x= 0; x < memcached_servers_count(servers); x++)
+  {
+    if (servers[x].address_info)
+    {
+      freeaddrinfo(servers[x].address_info);
+      servers[x].address_info= NULL;
+    }
+  }
+
+  if (ptr)
+  {
+    ptr->call_free(ptr, servers);
+  }
+  else
+  {
+    free(servers);
+  }
+}
+
+void memcached_servers_reset(memcached_st *ptr)
+{
+  server_list_free(ptr, ptr->hosts);
+
+  ptr->hosts= NULL;
+  ptr->number_of_hosts= 0;
+  ptr->last_disconnected_server= NULL;
+  ptr->server_failure_limit= 0;
+}
+
 void memcached_free(memcached_st *ptr)
 {
   /* If we have anything open, lets close it now */