X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fio.cc;h=f6cc36969de7255653517214cf0271e4629b9946;hb=d413abc63040e03377b85fe4c6545681596d5afc;hp=60614f5cfdf08b21b7994671cf41bdacc727c6fa;hpb=39575a40cf067da39e3f578bb3439d17ebd27638;p=awesomized%2Flibmemcached diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 60614f5c..f6cc3696 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -148,10 +148,10 @@ static bool process_input_buffer(org::libmemcached::Instance* instance) */ memcached_callback_st cb= *instance->root->callbacks; - memcached_set_processing_input((memcached_st *)instance->root, true); + memcached_set_processing_input((Memcached *)instance->root, true); char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; - memcached_st *root= (memcached_st *)instance->root; + Memcached *root= (Memcached *)instance->root; memcached_return_t error= memcached_response(instance, buffer, sizeof(buffer), &root->result); memcached_set_processing_input(root, false); @@ -212,7 +212,6 @@ static memcached_return_t io_wait(org::libmemcached::Instance* instance, if (instance->root->poll_timeout == 0) // Mimic 0 causes timeout behavior (not all platforms do this) { - instance->io_wait_count.timeouts++; return memcached_set_error(*instance, MEMCACHED_TIMEOUT, MEMCACHED_AT); } @@ -258,7 +257,6 @@ static memcached_return_t io_wait(org::libmemcached::Instance* instance, if (active_fd == 0) { - instance->io_wait_count.timeouts++; return memcached_set_error(*instance, MEMCACHED_TIMEOUT, MEMCACHED_AT); } @@ -712,24 +710,35 @@ void org::libmemcached::Instance::start_close_socket() } } +void org::libmemcached::Instance::reset_socket() +{ + if (fd != INVALID_SOCKET) + { + (void)closesocket(fd); + fd= INVALID_SOCKET; + } +} + void org::libmemcached::Instance::close_socket() { if (fd != INVALID_SOCKET) { + int shutdown_options= SHUT_RD; + if (options.is_shutting_down == false) + { + shutdown_options= SHUT_RDWR; + } + /* in case of death shutdown to avoid blocking at close() */ - if (shutdown(fd, SHUT_RD) == SOCKET_ERROR and get_socket_errno() != ENOTCONN) + if (shutdown(fd, shutdown_options) == SOCKET_ERROR and get_socket_errno() != ENOTCONN) { WATCHPOINT_NUMBER(fd); WATCHPOINT_ERRNO(get_socket_errno()); WATCHPOINT_ASSERT(get_socket_errno()); } - if (closesocket(fd) == SOCKET_ERROR) - { - WATCHPOINT_ERRNO(get_socket_errno()); - } + reset_socket(); state= MEMCACHED_SERVER_STATE_NEW; - fd= INVALID_SOCKET; } state= MEMCACHED_SERVER_STATE_NEW; @@ -746,7 +755,7 @@ void org::libmemcached::Instance::close_socket() major_version= minor_version= micro_version= UINT8_MAX; } -org::libmemcached::Instance* memcached_io_get_readable_server(memcached_st *memc, memcached_return_t&) +org::libmemcached::Instance* memcached_io_get_readable_server(Memcached *memc, memcached_return_t&) { #define MAX_SERVERS_TO_POLL 100 struct pollfd fds[MAX_SERVERS_TO_POLL];