Merge remote-tracking branch 'upstream/master'

This commit is contained in:
dennis
2016-02-15 10:12:09 +08:00
11 changed files with 38 additions and 31 deletions

View File

@@ -419,8 +419,11 @@ luaS_clonestring(lua_State *L, TString *ts) {
result = query_ptr(ts); result = query_ptr(ts);
if (result) if (result)
return result; return result;
// ts is not in SSM, so recalc hash, and add it to SSM
h = luaS_hash(str, l, 0); h = luaS_hash(str, l, 0);
result = query_string(h, str, l);
if (result)
return result;
// ts is not in SSM, so recalc hash, and add it to SSM
return add_string(h, str, l); return add_string(h, str, l);
} }

View File

@@ -885,7 +885,12 @@ int lhmac_sha1(lua_State *L);
int int
luaopen_crypt(lua_State *L) { luaopen_crypt(lua_State *L) {
luaL_checkversion(L); luaL_checkversion(L);
srandom(time(NULL)); static int init = 0;
if (!init) {
// Don't need call srandom more than once.
init = 1 ;
srandom(time(NULL));
}
luaL_Reg l[] = { luaL_Reg l[] = {
{ "hashkey", lhashkey }, { "hashkey", lhashkey },
{ "randomkey", lrandomkey }, { "randomkey", lrandomkey },

View File

@@ -469,7 +469,7 @@ lpack(lua_State *L) {
size_t sz=0; size_t sz=0;
const void * buffer = getbuffer(L, 1, &sz); const void * buffer = getbuffer(L, 1, &sz);
// the worst-case space overhead of packing is 2 bytes per 2 KiB of input (256 words = 2KiB). // the worst-case space overhead of packing is 2 bytes per 2 KiB of input (256 words = 2KiB).
size_t maxsz = (sz + 2047) / 2048 * 2 + sz; size_t maxsz = (sz + 2047) / 2048 * 2 + sz + 2;
void * output = lua_touserdata(L, lua_upvalueindex(1)); void * output = lua_touserdata(L, lua_upvalueindex(1));
int bytes; int bytes;
int osz = lua_tointeger(L, lua_upvalueindex(2)); int osz = lua_tointeger(L, lua_upvalueindex(2));

View File

@@ -72,7 +72,8 @@ local function request(fd, method, host, url, recvheader, header, content)
body = body .. padding body = body .. padding
end end
else else
body = nil -- no content-length, read all
body = body .. socket.readall(fd)
end end
end end

View File

@@ -19,6 +19,8 @@ function sockethelper.readfunc(fd)
end end
end end
sockethelper.readall = socket.readall
function sockethelper.writefunc(fd) function sockethelper.writefunc(fd)
return function(content) return function(content)
local ok = writebytes(fd, content) local ok = writebytes(fd, content)

View File

@@ -125,19 +125,6 @@ local function _compose_packet(self, req, size)
return packet return packet
end end
local function _send_packet(self, req, size)
local sock = self.sock
self.packet_no = self.packet_no + 1
local packet = _set_byte3(size) .. strchar(self.packet_no) .. req
return socket.write(self.sock,packet)
end
local function _recv_packet(self,sock) local function _recv_packet(self,sock)

View File

@@ -1,6 +1,4 @@
local io = io
local table = table local table = table
local debug = debug
return function (skynet, export) return function (skynet, export)

View File

@@ -1,6 +1,6 @@
local skynet = require "skynet" local skynet = require "skynet"
local debugchannel = require "debugchannel" local debugchannel = require "debugchannel"
local socket = require "socket" local socketdriver = require "socketdriver"
local injectrun = require "skynet.injectcode" local injectrun = require "skynet.injectcode"
local table = table local table = table
local debug = debug local debug = debug
@@ -56,7 +56,7 @@ local function gen_print(fd)
tmp[i] = tostring(tmp[i]) tmp[i] = tostring(tmp[i])
end end
table.insert(tmp, "\n") table.insert(tmp, "\n")
socket.write(fd, table.concat(tmp, "\t")) socketdriver.send(fd, table.concat(tmp, "\t"))
end end
end end
@@ -140,10 +140,13 @@ end
local function watch_proto(protoname, cond) local function watch_proto(protoname, cond)
local proto = assert(replace_upvalue(skynet.register_protocol, "proto"), "Can't find proto table") local proto = assert(replace_upvalue(skynet.register_protocol, "proto"), "Can't find proto table")
local p = proto[protoname] local p = proto[protoname]
local dispatch = p.dispatch_origin or p.dispatch if p == nil then
if p == nil or dispatch == nil then
return "No " .. protoname return "No " .. protoname
end end
local dispatch = p.dispatch_origin or p.dispatch
if dispatch == nil then
return "No dispatch"
end
p.dispatch_origin = dispatch p.dispatch_origin = dispatch
p.dispatch = function(...) p.dispatch = function(...)
if not cond or cond(...) then if not cond or cond(...) then
@@ -208,7 +211,7 @@ local function hook_dispatch(dispatcher, resp, fd, channel)
local function debug_hook() local function debug_hook()
while true do while true do
if newline then if newline then
socket.write(fd, prompt) socketdriver.send(fd, prompt)
newline = false newline = false
end end
local cmd = channel:read() local cmd = channel:read()
@@ -244,7 +247,9 @@ local function hook_dispatch(dispatcher, resp, fd, channel)
func = replace_upvalue(dispatcher, HOOK_FUNC, hook) func = replace_upvalue(dispatcher, HOOK_FUNC, hook)
if func then if func then
local function idle() local function idle()
skynet.timeout(10,idle) -- idle every 0.1s if raw_dispatcher then
skynet.timeout(10,idle) -- idle every 0.1s
end
end end
skynet.timeout(0, idle) skynet.timeout(0, idle)
end end

View File

@@ -1,7 +1,4 @@
local si = require "snax.interface" local si = require "snax.interface"
local io = io
local hotfix = {}
local function envid(f) local function envid(f)
local i = 1 local i = 1

View File

@@ -411,10 +411,10 @@ end
function channel:close() function channel:close()
if not self.__closed then if not self.__closed then
local thread = assert(self.__dispatch_thread) local thread = self.__dispatch_thread
self.__closed = true self.__closed = true
close_channel_socket(self) close_channel_socket(self)
if not self.__response and self.__dispatch_thread == thread then if not self.__response and self.__dispatch_thread == thread and thread then
-- dispatch by order, send close signal to dispatch thread -- dispatch by order, send close signal to dispatch thread
push_response(self, true, false) -- (true, false) is close signal push_response(self, true, false) -- (true, false) is close signal
end end

View File

@@ -346,7 +346,6 @@ dispatch_name_queue(struct harbor *h, struct keyvalue * node) {
struct harbor_msg_queue * queue = node->queue; struct harbor_msg_queue * queue = node->queue;
uint32_t handle = node->value; uint32_t handle = node->value;
int harbor_id = handle >> HANDLE_REMOTE_SHIFT; int harbor_id = handle >> HANDLE_REMOTE_SHIFT;
assert(harbor_id != 0);
struct skynet_context * context = h->ctx; struct skynet_context * context = h->ctx;
struct slave *s = &h->s[harbor_id]; struct slave *s = &h->s[harbor_id];
int fd = s->fd; int fd = s->fd;
@@ -366,6 +365,16 @@ dispatch_name_queue(struct harbor *h, struct keyvalue * node) {
push_queue_msg(s->queue, m); push_queue_msg(s->queue, m);
} }
} }
if (harbor_id == (h->slave >> HANDLE_REMOTE_SHIFT)) {
// the harbor_id is local
struct harbor_msg * m;
while ((m = pop_queue(s->queue)) != NULL) {
int type = m->header.destination >> HANDLE_REMOTE_SHIFT;
skynet_send(context, m->header.source, handle , type | PTYPE_TAG_DONTCOPY, m->header.session, m->buffer, m->size);
}
release_queue(s->queue);
s->queue = NULL;
}
} }
return; return;
} }