From db18839dc5608287445d061d1b06ca4efd44ccac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Thu, 27 Sep 2012 10:19:00 +0800 Subject: [PATCH] bugfix: gate ringbuffer alloc --- gate/mread.c | 8 ++++---- gate/ringbuffer.c | 16 ++++++++++------ gate/ringbuffer.h | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/gate/mread.c b/gate/mread.c index f795750a..bc95f80e 100644 --- a/gate/mread.c +++ b/gate/mread.c @@ -398,7 +398,7 @@ mread_pull(struct mread_pool * self , int size) { } printf("\n"); */ - ringbuffer_resize(rb, blk , bytes); + ringbuffer_shrink(rb, blk , bytes); if (bytes < sz) { _link_node(rb, self->active, s , blk); s->status = SOCKET_SUSPEND; @@ -408,20 +408,20 @@ mread_pull(struct mread_pool * self , int size) { break; } if (bytes == 0) { - ringbuffer_resize(rb, blk, 0); + ringbuffer_shrink(rb, blk, 0); _close_active(self); return NULL; } if (bytes == -1) { switch(errno) { case EWOULDBLOCK: - ringbuffer_resize(rb, blk, 0); + ringbuffer_shrink(rb, blk, 0); s->status = SOCKET_SUSPEND; return NULL; case EINTR: continue; default: - ringbuffer_resize(rb, blk, 0); + ringbuffer_shrink(rb, blk, 0); _close_active(self); return NULL; } diff --git a/gate/ringbuffer.c b/gate/ringbuffer.c index 30ee923b..43dc7fb3 100644 --- a/gate/ringbuffer.c +++ b/gate/ringbuffer.c @@ -69,12 +69,16 @@ _alloc(struct ringbuffer * rb, int total_size , int size) { blk->next = -1; blk->id = -1; struct ringbuffer_block * next = block_next(rb, blk); - rb->head = block_offset(rb, next); - if (align_length < total_size) { - next->length = total_size - align_length; - if (next->length >= sizeof(struct ringbuffer_block)) { - next->id = -1; + if (next) { + rb->head = block_offset(rb, next); + if (align_length < total_size) { + next->length = total_size - align_length; + if (next->length >= sizeof(struct ringbuffer_block)) { + next->id = -1; + } } + } else { + rb->head = 0; } return blk; } @@ -129,7 +133,7 @@ ringbuffer_collect(struct ringbuffer * rb) { } void -ringbuffer_resize(struct ringbuffer * rb, struct ringbuffer_block * blk, int size) { +ringbuffer_shrink(struct ringbuffer * rb, struct ringbuffer_block * blk, int size) { if (size == 0) { rb->head = block_offset(rb, blk); return; diff --git a/gate/ringbuffer.h b/gate/ringbuffer.h index a083e0cc..f08f12a2 100644 --- a/gate/ringbuffer.h +++ b/gate/ringbuffer.h @@ -15,7 +15,7 @@ void ringbuffer_delete(struct ringbuffer * rb); void ringbuffer_link(struct ringbuffer *rb , struct ringbuffer_block * prev, struct ringbuffer_block * next); struct ringbuffer_block * ringbuffer_alloc(struct ringbuffer * rb, int size); int ringbuffer_collect(struct ringbuffer * rb); -void ringbuffer_resize(struct ringbuffer * rb, struct ringbuffer_block * blk, int size); +void ringbuffer_shrink(struct ringbuffer * rb, struct ringbuffer_block * blk, int size); void ringbuffer_free(struct ringbuffer * rb, struct ringbuffer_block * blk); int ringbuffer_data(struct ringbuffer * rb, struct ringbuffer_block * blk, int size, int skip, void **ptr); void * ringbuffer_copy(struct ringbuffer * rb, struct ringbuffer_block * from, int skip, struct ringbuffer_block * to);