Added support for two part shutdown of socket.
[awesomized/libmemcached] / libmemcached / io.cc
index 6d9cad9a51f3e815e56e959ee3814b609bcd4681..c686397f8993dcc876ce061235be5ee0779e8941 100644 (file)
@@ -703,28 +703,34 @@ bool memcached_io_writev(org::libmemcached::Instance* ptr,
   return (complete_total == total);
 }
 
-
-void memcached_io_close(org::libmemcached::Instance* ptr)
+void org::libmemcached::Instance::start_close_socket()
 {
-  if (ptr->fd == INVALID_SOCKET)
+  if (fd != INVALID_SOCKET)
   {
-    return;
+    shutdown(fd, SHUT_WR);
+    options.is_shutting_down= true;
   }
+}
 
-  /* in case of death shutdown to avoid blocking at close() */
-  if (shutdown(ptr->fd, SHUT_RDWR) == SOCKET_ERROR and get_socket_errno() != ENOTCONN)
+void org::libmemcached::Instance::close_socket()
+{
+  if (fd != INVALID_SOCKET)
   {
-    WATCHPOINT_NUMBER(ptr->fd);
-    WATCHPOINT_ERRNO(get_socket_errno());
-    WATCHPOINT_ASSERT(get_socket_errno());
-  }
+    /* in case of death shutdown to avoid blocking at close() */
+    if (shutdown(fd, SHUT_RDWR) == SOCKET_ERROR and get_socket_errno() != ENOTCONN)
+    {
+      WATCHPOINT_NUMBER(fd);
+      WATCHPOINT_ERRNO(get_socket_errno());
+      WATCHPOINT_ASSERT(get_socket_errno());
+    }
 
-  if (closesocket(ptr->fd) == SOCKET_ERROR)
-  {
-    WATCHPOINT_ERRNO(get_socket_errno());
+    if (closesocket(fd) == SOCKET_ERROR)
+    {
+      WATCHPOINT_ERRNO(get_socket_errno());
+    }
+    state= MEMCACHED_SERVER_STATE_NEW;
+    fd= INVALID_SOCKET;
   }
-  ptr->state= MEMCACHED_SERVER_STATE_NEW;
-  ptr->fd= INVALID_SOCKET;
 }
 
 org::libmemcached::Instance* memcached_io_get_readable_server(memcached_st *memc, memcached_return_t&)