X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_io.c;h=299d4390659616b21ebd8a4b4b050dc6df7603ca;hb=51ccc3f82cc9bab7cf05e3b07b8a8b319349bde0;hp=daf64755c69ce171234c4c026aee925009aad9eb;hpb=46c20d43fbb4f84f30e06a55702c58c17f498d0e;p=m6w6%2Flibmemcached diff --git a/lib/memcached_io.c b/lib/memcached_io.c index daf64755..299d4390 100644 --- a/lib/memcached_io.c +++ b/lib/memcached_io.c @@ -37,7 +37,6 @@ static memcached_return io_wait(memcached_st *ptr, unsigned int server_key, return MEMCACHED_SUCCESS; else if (error == 0) { - WATCHPOINT_NUMBER(read_or_write); return MEMCACHED_TIMEOUT; } @@ -45,10 +44,36 @@ static memcached_return io_wait(memcached_st *ptr, unsigned int server_key, /* Imposssible for anything other then -1 */ WATCHPOINT_ASSERT(error == -1); memcached_quit_server(ptr, server_key, 1); + return MEMCACHED_FAILURE; } +void memcached_io_preread(memcached_st *ptr) +{ + unsigned int x; + + return; + + for (x= 0; x < ptr->number_of_hosts; x++) + { + if (memcached_server_response_count(ptr, x) && + ptr->hosts[x].read_data_length < MEMCACHED_MAX_BUFFER ) + { + size_t data_read; + + data_read= read(ptr->hosts[x].fd, + ptr->hosts[x].read_ptr + ptr->hosts[x].read_data_length, + MEMCACHED_MAX_BUFFER - ptr->hosts[x].read_data_length); + if (data_read == -1) + continue; + + ptr->hosts[x].read_buffer_length+= data_read; + ptr->hosts[x].read_data_length+= data_read; + } + } +} + ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, char *buffer, size_t length) { @@ -58,6 +83,7 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, while (length) { + uint8_t found_eof= 0; if (!ptr->hosts[server_key].read_buffer_length) { size_t data_read; @@ -74,6 +100,7 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, case EAGAIN: { memcached_return rc; + rc= io_wait(ptr, server_key, MEM_READ); if (rc == MEMCACHED_SUCCESS) @@ -92,18 +119,43 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, } else if (data_read) break; - /* If zero, just keep looping */ + /* If zero, just keep looping unless testing, then assert() */ + else + { + WATCHPOINT_ASSERT(0); + found_eof= 1; + break; + } } + ptr->hosts[server_key].read_data_length= data_read; ptr->hosts[server_key].read_buffer_length= data_read; ptr->hosts[server_key].read_ptr= ptr->hosts[server_key].read_buffer; } - *buffer_ptr= *ptr->hosts[server_key].read_ptr; - length--; - ptr->hosts[server_key].read_ptr++; - ptr->hosts[server_key].read_buffer_length--; - buffer_ptr++; + if (length > 1) + { + size_t difference; + + difference= (length > ptr->hosts[server_key].read_buffer_length) ? ptr->hosts[server_key].read_buffer_length : length; + + memcpy(buffer_ptr, ptr->hosts[server_key].read_ptr, difference); + length -= difference; + ptr->hosts[server_key].read_ptr+= difference; + ptr->hosts[server_key].read_buffer_length-= difference; + buffer_ptr+= difference; + } + else + { + *buffer_ptr= *ptr->hosts[server_key].read_ptr; + length--; + ptr->hosts[server_key].read_ptr++; + ptr->hosts[server_key].read_buffer_length--; + buffer_ptr++; + } + + if (found_eof) + break; } return (size_t)(buffer_ptr - buffer); @@ -150,36 +202,9 @@ ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key, memcached_return memcached_io_close(memcached_st *ptr, unsigned int server_key) { - memcached_return rc; - - rc= MEMCACHED_SUCCESS; - if (ptr->flags & MEM_NO_BLOCK) - { - int error; - struct pollfd fds[1]; - short flags= 0; - - flags= POLLHUP | POLLERR; - - memset(&fds, 0, sizeof(struct pollfd)); - fds[0].fd= ptr->hosts[server_key].fd; - fds[0].events= flags; - fds[0].revents= 0; - - error= poll(fds, 1, ptr->poll_timeout == -1 ? 100 : ptr->poll_timeout); - - if (error == -1) - { - memcached_quit_server(ptr, server_key, 1); - return MEMCACHED_FAILURE; - } - else if (error == 0) - return MEMCACHED_FAILURE; /* Timeout occurred */ - } - close(ptr->hosts[server_key].fd); - return rc; + return MEMCACHED_SUCCESS; } static ssize_t io_flush(memcached_st *ptr, unsigned int server_key,