- 论坛徽章:
- 0
|
函数的功能应该是:从socket中读取数据,然后存在buffer所指的内存中,同时追加到ptr的缓存中。
while (length)这块儿很奇怪,第一次ptr->read_buffer_length为0的时候会读取一次socket,然后把读取到的内容
放到buffer和ptr->read_buffer中,如果一次读完所有数据则直接跳出while,如果一次读了一部分,那接下来应该继续读,
但第二次时ptr->read_buffer_length已经不是0了,就不读了,这样的话就会陷入死循环了,好奇怪
- ssize_t memcached_io_read(memcached_server_st *ptr,
- void *buffer, size_t length)
- {
- char *buffer_ptr;
- buffer_ptr= buffer;
- while (length)
- {
- if (!ptr->read_buffer_length)
- {
- ssize_t data_read;
- while (1)
- {
- data_read= read(ptr->fd,
- ptr->read_buffer,
- MEMCACHED_MAX_BUFFER);
- if (data_read > 0)
- break;
- else if (data_read == -1)
- {
- ptr->cached_errno= errno;
- switch (errno)
- {
- case EAGAIN://io是非阻塞模式,但进程在读操作时被延迟了
- case EINTR: //被信号中断,或者没数据传输,或者负责这个文件的资源管理器不报告部分传输
- {
- memcached_return rc;
- rc= io_wait(ptr, MEM_READ);
- if (rc == MEMCACHED_SUCCESS)
- continue;
- }
- /* fall trough */
- default:
- {
- memcached_quit_server(ptr, 1);
- return -1;
- }
- }
- }
- else
- {
- /*
- *这里的意思应该是服务器已经挂掉了,做清理操作
- */
- memcached_quit_server(ptr, 1);
- return -1;
- }
- }
- ptr->io_bytes_sent = 0;//?
- ptr->read_data_length= data_read;
- ptr->read_buffer_length= data_read;
- ptr->read_ptr= ptr->read_buffer;
- }
- if (length > 1)
- {
- size_t difference;
- difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length;
- memcpy(buffer_ptr, ptr->read_ptr, difference);
- length -= difference;
- ptr->read_ptr+= difference;
- ptr->read_buffer_length-= difference;
- buffer_ptr+= difference;
- }
- else
- {
- *buffer_ptr= *ptr->read_ptr;
- ptr->read_ptr++;
- ptr->read_buffer_length--;
- buffer_ptr++;
- break;
- }
- }
- return (size_t)(buffer_ptr - (char*)buffer);
- }
复制代码 |
|