X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fio.cc;h=85e5ed42b82460a69d6c6b364b0af682ed189919;hb=b19d547098155fcda02900cdf38f7859e6a41f81;hp=0ed565d7e28a436e7d3bd9b26ba6598175253430;hpb=647f5b82467172c55e456b6833d4c2f0bdc0bc5a;p=awesomized%2Flibmemcached diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 0ed565d7..85e5ed42 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -268,16 +268,23 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr, { int err; socklen_t len= sizeof (err); - (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len); - memcached_set_errno(*ptr, (err == 0) ? get_socket_errno() : err, MEMCACHED_AT); + if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0) + { + if (err == 0) + { + continue; + } + errno= err; + } } else { memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT); } + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno memcached_quit_server(ptr, true); - return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT); + return memcached_set_errno(*ptr, local_errno, MEMCACHED_AT); } } } @@ -306,7 +313,6 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, return -1; } } - ssize_t sent_length; size_t return_length; char *local_write_ptr= ptr->write_buffer; size_t write_length= ptr->write_buffer_offset; @@ -316,14 +322,13 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); // UDP Sanity check, make sure that we are not sending somthing too big - if (ptr->type == MEMCACHED_CONNECTION_UDP && write_length > MAX_UDP_DATAGRAM_LENGTH) + if (memcached_is_udp(ptr->root) and write_length > MAX_UDP_DATAGRAM_LENGTH) { *error= MEMCACHED_WRITE_FAILURE; return -1; } - if (ptr->write_buffer_offset == 0 || (ptr->type == MEMCACHED_CONNECTION_UDP - && ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH)) + if (ptr->write_buffer_offset == 0 or (memcached_is_udp(ptr->root) and ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH)) { return 0; } @@ -340,10 +345,12 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, { WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); WATCHPOINT_ASSERT(write_length > 0); - sent_length= 0; - if (ptr->type == MEMCACHED_CONNECTION_UDP) + if (memcached_is_udp(ptr->root)) + { increment_udp_message_id(ptr); + } + ssize_t sent_length= 0; WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); if (with_flush) { @@ -376,8 +383,7 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, * buffer for more data and retry the write before * waiting.. */ - if (repack_input_buffer(ptr) or - process_input_buffer(ptr)) + if (repack_input_buffer(ptr) or process_input_buffer(ptr)) { continue; } @@ -407,19 +413,18 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, } } - if (ptr->type == MEMCACHED_CONNECTION_UDP and - (size_t)sent_length != write_length) + if (memcached_is_udp(ptr->root) and size_t(sent_length) != write_length) { memcached_quit_server(ptr, true); *error= memcached_set_error(*ptr, MEMCACHED_WRITE_FAILURE, MEMCACHED_AT); return -1; } - ptr->io_bytes_sent += (uint32_t) sent_length; + ptr->io_bytes_sent+= uint32_t(sent_length); local_write_ptr+= sent_length; - write_length-= (uint32_t) sent_length; - return_length+= (uint32_t) sent_length; + write_length-= uint32_t(sent_length); + return_length+= uint32_t(sent_length); } WATCHPOINT_ASSERT(write_length == 0); @@ -428,10 +433,14 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr, // if we are a udp server, the begining of the buffer is reserverd for // the upd frame header - if (ptr->type == MEMCACHED_CONNECTION_UDP) + if (memcached_is_udp(ptr->root)) + { ptr->write_buffer_offset= UDP_DATAGRAM_HEADER_LENGTH; + } else + { ptr->write_buffer_offset= 0; + } return (ssize_t) return_length; } @@ -547,8 +556,8 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr, } } - ptr->server_failure_counter= 0; *nread = (ssize_t)(buffer_ptr - (char*)buffer); + return MEMCACHED_SUCCESS; } @@ -611,13 +620,10 @@ memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr) static ssize_t _io_write(memcached_server_write_instance_st ptr, const void *buffer, size_t length, bool with_flush) { - size_t original_length; - const char* buffer_ptr; - WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET); - original_length= length; - buffer_ptr= static_cast(buffer); + size_t original_length= length; + const char *buffer_ptr= static_cast(buffer); while (length) { @@ -625,7 +631,7 @@ static ssize_t _io_write(memcached_server_write_instance_st ptr, size_t should_write; size_t buffer_end; - if (ptr->type == MEMCACHED_CONNECTION_UDP) + if (memcached_is_udp(ptr->root)) { //UDP does not support partial writes buffer_end= MAX_UDP_DATAGRAM_LENGTH; @@ -648,7 +654,7 @@ static ssize_t _io_write(memcached_server_write_instance_st ptr, buffer_ptr+= should_write; length-= should_write; - if (ptr->write_buffer_offset == buffer_end && ptr->type != MEMCACHED_CONNECTION_UDP) + if (ptr->write_buffer_offset == buffer_end and memcached_is_udp(ptr->root) == false) { WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);