Merge pull request #182 from cloudwu/dev

Dev
This commit is contained in:
云风
2014-10-15 10:18:29 +08:00
5 changed files with 28 additions and 9 deletions

View File

@@ -1076,9 +1076,15 @@ pack_seg(const uint8_t *src, uint8_t * buffer, int sz, int n) {
static inline void static inline void
write_ff(const uint8_t * src, uint8_t * des, int n) { write_ff(const uint8_t * src, uint8_t * des, int n) {
int i;
int align8_n = (n+7)&(~7);
des[0] = 0xff; des[0] = 0xff;
des[1] = n-1; des[1] = align8_n/8 - 1;
memcpy(des+2, src, n * 8); memcpy(des+2, src, n);
for(i=0; i< align8_n-n; i++){
des[n+2+i] = 0;
}
} }
int int
@@ -1092,6 +1098,7 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) {
const uint8_t * src = srcv; const uint8_t * src = srcv;
uint8_t * buffer = bufferv; uint8_t * buffer = bufferv;
for (i=0;i<srcsz;i+=8) { for (i=0;i<srcsz;i+=8) {
int n;
int padding = i+8 - srcsz; int padding = i+8 - srcsz;
if (padding > 0) { if (padding > 0) {
int j; int j;
@@ -1101,7 +1108,7 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) {
} }
src = tmp; src = tmp;
} }
int n = pack_seg(src, buffer, bufsz, ff_n); n = pack_seg(src, buffer, bufsz, ff_n);
bufsz -= n; bufsz -= n;
if (n == 10) { if (n == 10) {
// first FF // first FF
@@ -1112,14 +1119,14 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) {
++ff_n; ++ff_n;
if (ff_n == 256) { if (ff_n == 256) {
if (bufsz >= 0) { if (bufsz >= 0) {
write_ff(ff_srcstart, ff_desstart, 256); write_ff(ff_srcstart, ff_desstart, 256*8);
} }
ff_n = 0; ff_n = 0;
} }
} else { } else {
if (ff_n > 0) { if (ff_n > 0) {
if (bufsz >= 0) { if (bufsz >= 0) {
write_ff(ff_srcstart, ff_desstart, ff_n); write_ff(ff_srcstart, ff_desstart, ff_n*8);
} }
ff_n = 0; ff_n = 0;
} }
@@ -1128,8 +1135,11 @@ sproto_pack(const void * srcv, int srcsz, void * bufferv, int bufsz) {
buffer += n; buffer += n;
size += n; size += n;
} }
if (ff_n > 0 && bufsz >= 0) { if(bufsz >= 0){
write_ff(ff_srcstart, ff_desstart, ff_n); if(ff_n == 1)
write_ff(ff_srcstart, ff_desstart, 8);
else if (ff_n > 1)
write_ff(ff_srcstart, ff_desstart, srcsz - (intptr_t)(ff_srcstart - (const uint8_t*)srcv));
} }
return size; return size;
} }
@@ -1144,10 +1154,11 @@ sproto_unpack(const void * srcv, int srcsz, void * bufferv, int bufsz) {
--srcsz; --srcsz;
++src; ++src;
if (header == 0xff) { if (header == 0xff) {
int n;
if (srcsz < 0) { if (srcsz < 0) {
return -1; return -1;
} }
int n = (src[0] + 1) * 8; n = (src[0] + 1) * 8;
if (srcsz < n + 1) if (srcsz < n + 1)
return -1; return -1;
srcsz -= n + 1; srcsz -= n + 1;

View File

@@ -129,6 +129,7 @@ function mongo.client( conf )
response = dispatch_reply, response = dispatch_reply,
auth = mongo_auth(obj), auth = mongo_auth(obj),
backup = backup, backup = backup,
nodelay = true,
} }
setmetatable(obj, client_meta) setmetatable(obj, client_meta)
obj.__sock:connect(true) -- try connect only once obj.__sock:connect(true) -- try connect only once

View File

@@ -84,6 +84,7 @@ function redis.connect(db_conf)
host = db_conf.host, host = db_conf.host,
port = db_conf.port or 6379, port = db_conf.port or 6379,
auth = redis_login(db_conf.auth, db_conf.db), auth = redis_login(db_conf.auth, db_conf.db),
nodelay = true,
} }
-- try connect first only once -- try connect first only once
channel:connect(true) channel:connect(true)
@@ -199,6 +200,7 @@ function redis.watch(db_conf)
host = db_conf.host, host = db_conf.host,
port = db_conf.port or 6379, port = db_conf.port or 6379,
auth = watch_login(obj, db_conf.auth), auth = watch_login(obj, db_conf.auth),
nodelay = true,
} }
obj.__sock = channel obj.__sock = channel

View File

@@ -1,5 +1,6 @@
local skynet = require "skynet" local skynet = require "skynet"
local socket = require "socket" local socket = require "socket"
local socketdriver = require "socketdriver"
-- channel support auto reconnect , and capture socket error in request/response transaction -- channel support auto reconnect , and capture socket error in request/response transaction
-- { host = "", port = , auth = function(so) , response = function(so) session, data } -- { host = "", port = , auth = function(so) , response = function(so) session, data }
@@ -37,6 +38,7 @@ function socket_channel.channel(desc)
__sock = false, __sock = false,
__closed = false, __closed = false,
__authcoroutine = false, __authcoroutine = false,
__nodelay = desc.nodelay,
} }
return setmetatable(c, channel_meta) return setmetatable(c, channel_meta)
@@ -186,6 +188,9 @@ local function connect_once(self)
return false return false
end end
end end
if self.__nodelay then
socketdriver.nodelay(fd)
end
self.__sock = setmetatable( {fd} , channel_socket_meta ) self.__sock = setmetatable( {fd} , channel_socket_meta )
skynet.fork(dispatch_function(self), self) skynet.fork(dispatch_function(self), self)

View File

@@ -47,7 +47,7 @@ forward_message(int type, bool padding, struct socket_message * result) {
sm->ud = result->ud; sm->ud = result->ud;
if (padding) { if (padding) {
sm->buffer = NULL; sm->buffer = NULL;
strcpy((char*)(sm+1), result->data); memcpy(sm+1, result->data, sz - sizeof(*sm));
} else { } else {
sm->buffer = result->data; sm->buffer = result->data;
} }