X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fio.c;h=f1afc6695322fe961edc7a9dbd2c41a402def199;hb=475f477dab6dfc5e4f018d1ecfb128c37e2c44a0;hp=17398aa37dd2bc54f790f6eec81b403b09456c69;hpb=022648039175d7f2e05da530ef77149335d8515d;p=m6w6%2Flibmemcached diff --git a/libmemcached/io.c b/libmemcached/io.c index 17398aa3..f1afc669 100644 --- a/libmemcached/io.c +++ b/libmemcached/io.c @@ -19,10 +19,11 @@ typedef enum { MEM_WRITE } memc_read_or_write; -static ssize_t io_flush(memcached_server_instance_st *ptr, memcached_return_t *error); -static void increment_udp_message_id(memcached_server_instance_st *ptr); +static ssize_t io_flush(memcached_server_write_instance_st ptr, + memcached_return_t *error); +static void increment_udp_message_id(memcached_server_write_instance_st ptr); -static memcached_return_t io_wait(memcached_server_instance_st *ptr, +static memcached_return_t io_wait(memcached_server_write_instance_st ptr, memc_read_or_write read_or_write) { struct pollfd fds= { @@ -53,7 +54,8 @@ static memcached_return_t io_wait(memcached_server_instance_st *ptr, if (ptr->root->flags.no_block == false) timeout= -1; - while (1) + size_t loop_max= 5; + while (--loop_max) { error= poll(&fds, 1, timeout); @@ -63,12 +65,14 @@ static memcached_return_t io_wait(memcached_server_instance_st *ptr, return MEMCACHED_SUCCESS; case 0: return MEMCACHED_TIMEOUT; +#ifdef TARGET_OS_LINUX case ERESTART: +#endif case EINTR: continue; default: ptr->cached_errno= error; - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); return MEMCACHED_FAILURE; } @@ -77,7 +81,7 @@ static memcached_return_t io_wait(memcached_server_instance_st *ptr, /* Imposssible for anything other then -1 */ WATCHPOINT_ASSERT(error == -1); ptr->cached_errno= error; - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); return MEMCACHED_FAILURE; } @@ -88,7 +92,7 @@ static memcached_return_t io_wait(memcached_server_instance_st *ptr, * * @param ptr the server to pack */ -static bool repack_input_buffer(memcached_server_instance_st *ptr) +static bool repack_input_buffer(memcached_server_write_instance_st ptr) { if (ptr->read_ptr != ptr->read_buffer) { @@ -128,7 +132,7 @@ static bool repack_input_buffer(memcached_server_instance_st *ptr) * @param ptr the server to star processing iput messages for * @return true if we processed anything, false otherwise */ -static bool process_input_buffer(memcached_server_instance_st *ptr) +static bool process_input_buffer(memcached_server_write_instance_st ptr) { /* ** We might be able to process some of the response messages if we @@ -231,7 +235,7 @@ void memcached_io_preread(memcached_st *ptr) } #endif -memcached_return_t memcached_io_read(memcached_server_instance_st *ptr, +memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr, void *buffer, size_t length, ssize_t *nread) { char *buffer_ptr; @@ -257,14 +261,16 @@ memcached_return_t memcached_io_read(memcached_server_instance_st *ptr, { case EAGAIN: case EINTR: +#ifdef TARGET_OS_LINUX case ERESTART: +#endif if ((rc= io_wait(ptr, MEM_READ)) == MEMCACHED_SUCCESS) continue; /* fall through */ default: { - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); *nread= -1; return rc; } @@ -281,7 +287,7 @@ memcached_return_t memcached_io_read(memcached_server_instance_st *ptr, for blocking I/O we do not return 0 and for non-blocking case it will return EGAIN if data is not immediatly available. */ - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); *nread= -1; return MEMCACHED_UNKNOWN_READ_FAILURE; } @@ -320,7 +326,7 @@ memcached_return_t memcached_io_read(memcached_server_instance_st *ptr, return MEMCACHED_SUCCESS; } -ssize_t memcached_io_write(memcached_server_instance_st *ptr, +ssize_t memcached_io_write(memcached_server_write_instance_st ptr, const void *buffer, size_t length, bool with_flush) { size_t original_length; @@ -397,7 +403,7 @@ ssize_t memcached_io_write(memcached_server_instance_st *ptr, return (ssize_t) original_length; } -memcached_return_t memcached_io_close(memcached_server_instance_st *ptr) +memcached_return_t memcached_io_close(memcached_server_write_instance_st ptr) { if (ptr->fd == -1) { @@ -420,7 +426,7 @@ memcached_return_t memcached_io_close(memcached_server_instance_st *ptr) return MEMCACHED_SUCCESS; } -memcached_server_instance_st *memcached_io_get_readable_server(memcached_st *memc) +memcached_server_write_instance_st memcached_io_get_readable_server(memcached_st *memc) { #define MAX_SERVERS_TO_POLL 100 struct pollfd fds[MAX_SERVERS_TO_POLL]; @@ -430,7 +436,7 @@ memcached_server_instance_st *memcached_io_get_readable_server(memcached_st *mem x< memcached_server_count(memc) && host_index < MAX_SERVERS_TO_POLL; ++x) { - memcached_server_instance_st *instance= + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, x); if (instance->read_buffer_length > 0) /* I have data in the buffer */ @@ -450,7 +456,7 @@ memcached_server_instance_st *memcached_io_get_readable_server(memcached_st *mem /* We have 0 or 1 server with pending events.. */ for (uint32_t x= 0; x< memcached_server_count(memc); ++x) { - memcached_server_instance_st *instance= + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, x); if (memcached_server_response_count(instance) > 0) @@ -476,7 +482,7 @@ memcached_server_instance_st *memcached_io_get_readable_server(memcached_st *mem { for (uint32_t y= 0; y < memcached_server_count(memc); ++y) { - memcached_server_instance_st *instance= + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, y); if (instance->fd == fds[x].fd) @@ -489,7 +495,7 @@ memcached_server_instance_st *memcached_io_get_readable_server(memcached_st *mem return NULL; } -static ssize_t io_flush(memcached_server_instance_st *ptr, +static ssize_t io_flush(memcached_server_write_instance_st ptr, memcached_return_t *error) { /* @@ -564,11 +570,11 @@ static ssize_t io_flush(memcached_server_instance_st *ptr, if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_TIMEOUT) continue; - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); return -1; } default: - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); *error= MEMCACHED_ERRNO; return -1; } @@ -577,7 +583,7 @@ static ssize_t io_flush(memcached_server_instance_st *ptr, if (ptr->type == MEMCACHED_CONNECTION_UDP && (size_t)sent_length != write_length) { - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); return -1; } @@ -605,16 +611,16 @@ static ssize_t io_flush(memcached_server_instance_st *ptr, /* Eventually we will just kill off the server with the problem. */ -void memcached_io_reset(memcached_server_instance_st *ptr) +void memcached_io_reset(memcached_server_write_instance_st ptr) { - memcached_quit_server(ptr, 1); + memcached_quit_server(ptr, true); } /** * Read a given number of bytes from the server and place it into a specific * buffer. Reset the IO channel on this server if an error occurs. */ -memcached_return_t memcached_safe_read(memcached_server_instance_st *ptr, +memcached_return_t memcached_safe_read(memcached_server_write_instance_st ptr, void *dta, size_t size) { @@ -635,7 +641,7 @@ memcached_return_t memcached_safe_read(memcached_server_instance_st *ptr, return MEMCACHED_SUCCESS; } -memcached_return_t memcached_io_readline(memcached_server_instance_st *ptr, +memcached_return_t memcached_io_readline(memcached_server_write_instance_st ptr, char *buffer_ptr, size_t size) { @@ -693,7 +699,7 @@ memcached_return_t memcached_io_readline(memcached_server_instance_st *ptr, * extracts the message number from message_id, increments it and then * writes the new value back into the header */ -static void increment_udp_message_id(memcached_server_instance_st *ptr) +static void increment_udp_message_id(memcached_server_write_instance_st ptr) { struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer; uint16_t cur_req= get_udp_datagram_request_id(header); @@ -706,7 +712,7 @@ static void increment_udp_message_id(memcached_server_instance_st *ptr) header->request_id= htons((uint16_t) (thread_id | msg_num)); } -memcached_return_t memcached_io_init_udp_header(memcached_server_instance_st *ptr, uint16_t thread_id) +memcached_return_t memcached_io_init_udp_header(memcached_server_write_instance_st ptr, uint16_t thread_id) { if (thread_id > UDP_REQUEST_ID_MAX_THREAD_ID) return MEMCACHED_FAILURE;