X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmemcached_io.c;h=38580638d7f197c81d373373954cb299b8aabc98;hb=cfe8176feba42fc63e8f627f9ac613a12a368b92;hp=de3eda32875460018fa4aa320237197be0d40d53;hpb=f45cff13d17432059886e6f426d3c8c4d1f23732;p=m6w6%2Flibmemcached diff --git a/lib/memcached_io.c b/lib/memcached_io.c index de3eda32..38580638 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) { @@ -74,6 +99,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) @@ -95,15 +121,31 @@ ssize_t memcached_io_read(memcached_st *ptr, unsigned int server_key, /* If zero, just keep looping */ } + 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++; + } } return (size_t)(buffer_ptr - buffer); @@ -150,19 +192,6 @@ ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key, memcached_return memcached_io_close(memcached_st *ptr, unsigned int server_key) { - if (ptr->flags & MEM_NO_BLOCK && 0) - { - int sock_size; - int error; - socklen_t sock_length; - - error= getsockopt(ptr->hosts[server_key].fd, IPPROTO_TCP, SO_LINGER, - &sock_size, &sock_length); - - WATCHPOINT_NUMBER(error); - WATCHPOINT_NUMBER(sock_size); - } - close(ptr->hosts[server_key].fd); return MEMCACHED_SUCCESS;