X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fio.cc;h=e246f3ec50d4165eb812e25829bff1b24055c3c1;hb=cefa03b14574d23cdd2f9db5ff28f210e697042c;hp=8796d5034b8a2dd82927443662e32918579dab58;hpb=e5e68ea1b5afaf29870a5f5faf5908d32fbd1c70;p=awesomized%2Flibmemcached diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 8796d503..e246f3ec 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -273,9 +273,11 @@ static memcached_return_t io_wait(memcached_instance_st* instance, case EFAULT: case ENOMEM: memcached_set_error(*instance, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT); + break; case EINVAL: memcached_set_error(*instance, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid")); + break; default: memcached_set_errno(*instance, local_errno, MEMCACHED_AT, memcached_literal_param("poll")); @@ -342,6 +344,7 @@ static bool io_flush(memcached_instance_st* instance, } ssize_t sent_length= ::send(instance->fd, local_write_ptr, write_length, flags); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno if (sent_length == SOCKET_ERROR) { @@ -381,14 +384,14 @@ static bool io_flush(memcached_instance_st* instance, } memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); return false; } case ENOTCONN: case EPIPE: default: memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); WATCHPOINT_ASSERT(instance->fd == INVALID_SOCKET); return false; } @@ -422,6 +425,8 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) do { data_read= ::recv(instance->fd, instance->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno + if (data_read == SOCKET_ERROR) { switch (get_socket_errno()) @@ -455,12 +460,13 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) WATCHPOINT_ASSERT(0); case EBADF: assert_msg(instance->fd != INVALID_SOCKET, "Programmer error, invalid socket"); + /* fall through */ case EINVAL: case EFAULT: case ECONNREFUSED: default: memcached_quit_server(instance, true); - memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + memcached_set_errno(*instance, local_errno, MEMCACHED_AT); break; } @@ -589,6 +595,7 @@ memcached_return_t memcached_io_slurp(memcached_instance_st* instance) assert(0); case EBADF: assert_msg(instance->fd != INVALID_SOCKET, "Invalid socket state"); + /* fall through */ case EINVAL: case EFAULT: case ECONNREFUSED: