fixnetpack

不一定两次读完。没有读完的时候把uc放回queue。
This commit is contained in:
mercury landed
2014-04-16 17:11:21 +08:00
parent 0279144db1
commit 2308ce3905

View File

@@ -228,6 +228,10 @@ filter_data_(lua_State *L, int fd, uint8_t * buffer, int size) {
int need = uc->pack.size - uc->read; int need = uc->pack.size - uc->read;
if (size < need) { if (size < need) {
memcpy(uc->pack.buffer + uc->read, buffer, size); memcpy(uc->pack.buffer + uc->read, buffer, size);
uc->read += size;
int h = hash_fd(fd);
uc->next = q->hash[h];
q->hash[h] = uc;
return 1; return 1;
} }
memcpy(uc->pack.buffer + uc->read, buffer, need); memcpy(uc->pack.buffer + uc->read, buffer, need);
@@ -246,7 +250,7 @@ filter_data_(lua_State *L, int fd, uint8_t * buffer, int size) {
free(uc); free(uc);
push_more(L, fd, buffer, size); push_more(L, fd, buffer, size);
lua_pushvalue(L, lua_upvalueindex(TYPE_MORE)); lua_pushvalue(L, lua_upvalueindex(TYPE_MORE));
return 2; return 2;
} else { } else {
if (size == 1) { if (size == 1) {
struct uncomplete * uc = save_uncomplete(L, fd); struct uncomplete * uc = save_uncomplete(L, fd);
@@ -282,7 +286,7 @@ filter_data_(lua_State *L, int fd, uint8_t * buffer, int size) {
size -= pack_size; size -= pack_size;
push_more(L, fd, buffer, size); push_more(L, fd, buffer, size);
lua_pushvalue(L, lua_upvalueindex(TYPE_MORE)); lua_pushvalue(L, lua_upvalueindex(TYPE_MORE));
return 2; return 2;
} }
} }
@@ -290,7 +294,7 @@ static inline int
filter_data(lua_State *L, int fd, uint8_t * buffer, int size) { filter_data(lua_State *L, int fd, uint8_t * buffer, int size) {
int ret = filter_data_(L, fd, buffer, size); int ret = filter_data_(L, fd, buffer, size);
// buffer is the data of socket message, it malloc at socket_server.c : function forward_message . // buffer is the data of socket message, it malloc at socket_server.c : function forward_message .
// it should be free before return, // it should be free before return,
free(buffer); free(buffer);
return ret; return ret;
} }
@@ -308,7 +312,7 @@ pushstring(lua_State *L, const char * msg) {
userdata queue userdata queue
lightuserdata msg lightuserdata msg
integer size integer size
return return
userdata queue userdata queue
integer type integer type
integer fd integer fd
@@ -359,7 +363,7 @@ lfilter(lua_State *L) {
/* /*
userdata queue userdata queue
return return
integer fd integer fd
lightuserdata msg lightuserdata msg
integer size integer size
@@ -381,7 +385,7 @@ lpop(lua_State *L) {
} }
/* /*
string msg | lightuserdata/integer string msg | lightuserdata/integer
lightuserdata/integer lightuserdata/integer
*/ */