return MEMCACHED_SUCCESS;
else if (error == 0)
{
- WATCHPOINT_NUMBER(read_or_write);
return MEMCACHED_TIMEOUT;
}
/* 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)
{
case EAGAIN:
{
memcached_return rc;
+
rc= io_wait(ptr, server_key, MEM_READ);
if (rc == MEMCACHED_SUCCESS)
}
else if (data_read)
break;
- /* If zero, just keep looping */
+ /* If zero, just keep looping unless testing, then assert() */
+ else
+ WATCHPOINT_ASSERT(0);
}
+ 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);