From 6319225b7af76a62b94b1088da65dc85d989890b Mon Sep 17 00:00:00 2001 From: Yecheng Fu Date: Fri, 4 Jan 2013 18:06:33 +0800 Subject: [PATCH] =?UTF-8?q?BUG:=20expand=20buffer=20=E5=90=8E=E6=89=80?= =?UTF-8?q?=E5=8F=96=E7=9A=84=20slot=20=E4=B8=8D=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=EF=BC=8C=E4=B8=8E=E4=B8=8B=E6=AC=A1=E8=A6=81=E5=8F=96=E7=9A=84?= =?UTF-8?q?=20slot=20=E6=98=AF=E5=90=8C=E4=B8=80=E4=B8=AA=20slot=E3=80=82?= =?UTF-8?q?=20FIX:=20=E5=85=88=20expand=EF=BC=8C=E5=86=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=20slot=20=E5=B9=B6=E7=A7=BB=E5=8A=A8=20tail=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service-src/service_harbor.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/service-src/service_harbor.c b/service-src/service_harbor.c index 76d1fdca..bf27b529 100644 --- a/service-src/service_harbor.c +++ b/service-src/service_harbor.c @@ -63,21 +63,23 @@ struct harbor { static void _push_queue(struct msg_queue * queue, const void * buffer, size_t sz, struct remote_message_header * header) { - struct msg * slot = &queue->data[queue->tail]; - queue->tail = (queue->tail + 1) % queue->size; - if (queue->tail == queue->head) { + // If there is only 1 free slot which is reserved to distinguish full/empty + // of circular buffer, expand it. + if (((queue->tail + 1) % queue->size) == queue->head) { struct msg * new_buffer = malloc(queue->size * 2 * sizeof(struct msg)); int i; - for (i=0;isize;i++) { + for (i=0;isize-1;i++) { new_buffer[i] = queue->data[(i+queue->head) % queue->size]; } free(queue->data); queue->data = new_buffer; queue->head = 0; - queue->tail = queue->size; + queue->tail = queue->size - 1; queue->size *= 2; - slot = &queue->data[queue->tail]; } + struct msg * slot = &queue->data[queue->tail]; + queue->tail = (queue->tail + 1) % queue->size; + slot->buffer = malloc(sz + sizeof(*header)); memcpy(slot->buffer, buffer, sz); memcpy(slot->buffer + sz, header, sizeof(*header));