bugfix: gate ringbuffer alloc

This commit is contained in:
云风
2012-09-27 10:19:00 +08:00
parent b21e08fc58
commit db18839dc5
3 changed files with 15 additions and 11 deletions

View File

@@ -398,7 +398,7 @@ mread_pull(struct mread_pool * self , int size) {
} }
printf("\n"); printf("\n");
*/ */
ringbuffer_resize(rb, blk , bytes); ringbuffer_shrink(rb, blk , bytes);
if (bytes < sz) { if (bytes < sz) {
_link_node(rb, self->active, s , blk); _link_node(rb, self->active, s , blk);
s->status = SOCKET_SUSPEND; s->status = SOCKET_SUSPEND;
@@ -408,20 +408,20 @@ mread_pull(struct mread_pool * self , int size) {
break; break;
} }
if (bytes == 0) { if (bytes == 0) {
ringbuffer_resize(rb, blk, 0); ringbuffer_shrink(rb, blk, 0);
_close_active(self); _close_active(self);
return NULL; return NULL;
} }
if (bytes == -1) { if (bytes == -1) {
switch(errno) { switch(errno) {
case EWOULDBLOCK: case EWOULDBLOCK:
ringbuffer_resize(rb, blk, 0); ringbuffer_shrink(rb, blk, 0);
s->status = SOCKET_SUSPEND; s->status = SOCKET_SUSPEND;
return NULL; return NULL;
case EINTR: case EINTR:
continue; continue;
default: default:
ringbuffer_resize(rb, blk, 0); ringbuffer_shrink(rb, blk, 0);
_close_active(self); _close_active(self);
return NULL; return NULL;
} }

View File

@@ -69,6 +69,7 @@ _alloc(struct ringbuffer * rb, int total_size , int size) {
blk->next = -1; blk->next = -1;
blk->id = -1; blk->id = -1;
struct ringbuffer_block * next = block_next(rb, blk); struct ringbuffer_block * next = block_next(rb, blk);
if (next) {
rb->head = block_offset(rb, next); rb->head = block_offset(rb, next);
if (align_length < total_size) { if (align_length < total_size) {
next->length = total_size - align_length; next->length = total_size - align_length;
@@ -76,6 +77,9 @@ _alloc(struct ringbuffer * rb, int total_size , int size) {
next->id = -1; next->id = -1;
} }
} }
} else {
rb->head = 0;
}
return blk; return blk;
} }
@@ -129,7 +133,7 @@ ringbuffer_collect(struct ringbuffer * rb) {
} }
void 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) { if (size == 0) {
rb->head = block_offset(rb, blk); rb->head = block_offset(rb, blk);
return; return;

View File

@@ -15,7 +15,7 @@ void ringbuffer_delete(struct ringbuffer * rb);
void ringbuffer_link(struct ringbuffer *rb , struct ringbuffer_block * prev, struct ringbuffer_block * next); void ringbuffer_link(struct ringbuffer *rb , struct ringbuffer_block * prev, struct ringbuffer_block * next);
struct ringbuffer_block * ringbuffer_alloc(struct ringbuffer * rb, int size); struct ringbuffer_block * ringbuffer_alloc(struct ringbuffer * rb, int size);
int ringbuffer_collect(struct ringbuffer * rb); 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); 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); 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); void * ringbuffer_copy(struct ringbuffer * rb, struct ringbuffer_block * from, int skip, struct ringbuffer_block * to);