.)肯定会涉及到buffer,swoole中的buffer实现是swBuffer,其实就是一个单链表。swBuffer数据结构在swBuffer数据结构中,trunk_num是链表元素个数,trunk_size是创建swBuffer缓冲区时约定的链表元素大小(实际大小不一定是这个值),length是总的缓冲区实际占用的内存大小。swBuffer_trunk中一共有三种类型,分别应用于三种场景:缓存数据、发送文件、提醒连接关闭。长度是指元素的内存大小。enumswBufferChunk{SW_CHUNK_DATA,SW_CHUNK_SENDFILE,SW_CHUNK_CLOSE,};typedefstruct_swBuffer_trunk{uint32_t类型;uint32_t长度;uint32_t偏移量;union{void*ptr;结构{uint32_tval1;uint32_tval2;}数据;}店铺;uint32_t大小;void(*destroy)(struct_swBuffer_trunk*chunk);struct_swBuffer_trunk*next;}swBuffer_trunk;typedefstruct_swBuffer{intfd;uint8_ttrunk_num;//trunk数量uint16_ttrunk_size;uint32_t长度;swBuffer_trunk*头;swBuffer_trunk*tail;}swBuffer;swBuffer的创建swBuffer的创建很简单,只是初始化整个swBuffer的headerif(buffer==NULL){swWarn("mallocforbufferfailed.Error:%s[%d]",strerror(errno),errno);返回空值;}bzero(缓冲器,sizeof(swBuffer));缓冲区->trunk_size=trunk_size;rreturnbuffer;}swBuffer内存申请swBuffer内存的申请逻辑也很简单。根据传入的size参数,为链表元素申请内存,初始化成员变量,然后将链表元素放在链表尾部:intswBuffer_append(swBuffer*buffer,void*data,uint32_tsize){swBuffer_trunk*chunk=swBuffer_new_trunk(缓冲区,SW_CHUNK_DATA,大小);如果(块==NULL){返回SW_ERR;}缓冲区->长度+=大小;块->长度=大小;memcpy(chunk->store.ptr,data,size);swTraceLog(SW_TRACE_BUFFER,"trunk_n=%d|size=%d|trunk_len=%d|trunk=%p",buffer->trunk_num,size,chunk->length,chunk);returnSW_OK;}swBuffer_trunk*swBuffer_new_trunk(swBuffer*buffer,uint32_ttype,uint32_tsize){swBuffer_trunk*chunk=sw_malloc(sizeof(swBuffer_trunk));if(chunk==NULL){swWarnfort("mfailed.Error:%s[%d]",strerror(errno),errno);返回空值;}bzero(块,sizeof(swBuffer_trunk));//需要分配内存if(type==SW_CHUNK_DATA&&size>0){void*buf=sw_malloc(size);if(buf==NULL){swWarn("malloc(%d)fordatafailed.Error:%s[%d]",size,strerror(errno),errno);sw_free(块);返回空值;}块->大小=大小;chunk->store.ptr=buf;}块->类型=类型;缓冲区->trunk_num++;if(buffer->head==NULL){buffer->tail=buffer->head=chunk;}else{buffer->tail->next=chunk;缓冲区->尾=块;}返回块;获取head:#defineswBuffer_get_trunk(buffer)(buffer->head)swBuffer元素的pop获取到buffer的元素后,相应删除head链表元素:voidswBuffer_pop_trunk(swBuffer*buffer,swBuffer_trunk*chunk){if(chunk->next==NULL){buffer->head=NULL;缓冲区->尾=NULL;缓冲区->长度=0;缓冲区->trunk_num=0;}else{buffer->head=chunk->下一个;缓冲区->长度-=块->长度;缓冲区->trunk_num--;}if(chunk->type==SW_CHUNK_DATA){sw_free(chunk->store.ptr);}if(chunk->destroy){chunk->destroy(chunk);}sw_free(chunk);}swBuffer冲区的销售intswBuffer_free(swBuffer*buffer){volatileswBuffer_trunk*chunk=buffer->head;void**will_free_trunk;//释放点while(chunk!=NULL){if(chunk->type==SW_CHUNK_DATA){sw_free(chunk->store.ptr);}will_free_trunk=(void*)块;大块=大块->下一个;sw_free(will_free_trunk);}sw_free(缓冲区);返回SW_OK;}
