From 9dc7b0dfebe44cf15cc76216a7c3e5e64d1f3be5 Mon Sep 17 00:00:00 2001 From: yeoncheol-kim Date: Tue, 21 Jan 2025 11:00:22 +0900 Subject: [PATCH] INTERNAL: Refactor the memcached_io_read function --- libmemcached/io.cc | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 01687d23..89632461 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -539,7 +539,8 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr, } char *buffer_ptr= static_cast(buffer); - while (length) + size_t remains= length; + while (remains) { if (ptr->read_buffer_length == 0) { @@ -551,27 +552,31 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr, return io_fill_ret; } } - if (length > 1) + if (remains > 1) { - size_t difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length; - memcpy(buffer_ptr, ptr->read_ptr, difference); + size_t difference= (remains > ptr->read_buffer_length) ? ptr->read_buffer_length : remains; + if (buffer_ptr) { + memcpy(buffer_ptr, ptr->read_ptr, difference); + buffer_ptr+= difference; + } - length-= difference; ptr->read_ptr+= difference; ptr->read_buffer_length-= difference; - buffer_ptr+= difference; + remains-= difference; } else { - *buffer_ptr= *ptr->read_ptr; + if (buffer_ptr) { + *buffer_ptr= *ptr->read_ptr; + buffer_ptr++; + } ptr->read_ptr++; ptr->read_buffer_length--; - buffer_ptr++; break; } } - *nread = (ssize_t)(buffer_ptr - (char*)buffer); + *nread = (ssize_t)(length - remains); return MEMCACHED_SUCCESS; } @@ -847,22 +852,14 @@ memcached_return_t memcached_safe_read(memcached_server_write_instance_st ptr, void *dta, size_t size) { - size_t offset= 0; char *data= static_cast(dta); + ssize_t nread; + memcached_return_t rc; - while (offset < size) - { - ssize_t nread; - memcached_return_t rc; - - while (memcached_continue(rc= memcached_io_read(ptr, data + offset, size - offset, &nread))) { }; - - if (memcached_failed(rc)) - { - return rc; - } + while (memcached_continue(rc= memcached_io_read(ptr, data, size, &nread))) {} - offset+= (size_t) nread; + if (memcached_failed(rc)) { + return rc; } return MEMCACHED_SUCCESS;