mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 12:43:09 +00:00
bugfix: gate ringbuffer alloc
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user