bugfix: dispatch all message in one socket message

This commit is contained in:
云风
2013-08-26 14:25:42 +08:00
parent caaa8fcdbe
commit c826d4d246
2 changed files with 14 additions and 6 deletions

View File

@@ -88,8 +88,8 @@ databuffer_read(struct databuffer *db, struct messagepool *mp, void * buffer, in
} }
} }
static int static void
databuffer_push(struct databuffer *db, struct messagepool *mp, int header_size,void *data, int sz) { databuffer_push(struct databuffer *db, struct messagepool *mp, void *data, int sz) {
struct message * m; struct message * m;
if (mp->freelist) { if (mp->freelist) {
m = mp->freelist; m = mp->freelist;
@@ -120,7 +120,10 @@ databuffer_push(struct databuffer *db, struct messagepool *mp, int header_size,v
db->tail->next = m; db->tail->next = m;
db->tail = m; db->tail = m;
} }
}
static int
databuffer_readheader(struct databuffer *db, struct messagepool *mp, int header_size) {
if (db->header == 0) { if (db->header == 0) {
// parser header (2 or 4) // parser header (2 or 4)
if (db->size < header_size) { if (db->size < header_size) {

View File

@@ -183,10 +183,15 @@ _forward(struct gate *g, struct connection * c, int size) {
static void static void
dispatch_message(struct gate *g, struct connection *c, int id, void * data, int sz) { dispatch_message(struct gate *g, struct connection *c, int id, void * data, int sz) {
int size = databuffer_push(&c->buffer,&g->mp, g->header_size, data, sz); databuffer_push(&c->buffer,&g->mp, data, sz);
if (size > 0) { for (;;) {
_forward(g, c, size); int size = databuffer_readheader(&c->buffer, &g->mp, g->header_size);
databuffer_reset(&c->buffer); if (size < 0) {
return;
} else if (size > 0) {
_forward(g, c, size);
databuffer_reset(&c->buffer);
}
} }
} }