diff options
| author | ruki <[email protected]> | 2020-01-30 22:48:01 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-01-30 10:48:06 +0800 |
| commit | 4cb343a145c152bd3ac3da8704337905408699dc (patch) | |
| tree | 2948043b2a1d6778e68a7b273feb649879d0e7a0 | |
| parent | e992084750b81a09a56fc0a7c428b3861cfb04dc (diff) | |
improve core/poller
| -rw-r--r-- | core/src/xmake/io/poller_insert.c | 25 | ||||
| -rw-r--r-- | core/src/xmake/io/poller_modify.c | 25 | ||||
| -rw-r--r-- | core/src/xmake/io/poller_remove.c | 23 | ||||
| -rw-r--r-- | core/src/xmake/io/poller_wait.c | 8 | ||||
| -rw-r--r-- | xmake/core/base/poller.lua | 113 | ||||
| -rw-r--r-- | xmake/core/base/scheduler.lua | 17 |
6 files changed, 95 insertions, 116 deletions
diff --git a/core/src/xmake/io/poller_insert.c b/core/src/xmake/io/poller_insert.c index bb238ad93..9043ed463 100644 --- a/core/src/xmake/io/poller_insert.c +++ b/core/src/xmake/io/poller_insert.c @@ -35,27 +35,34 @@ * interfaces */ -// io.poller_insert(sock, events) +// io.poller_insert(obj:otype(), obj:cdata(), events) tb_int_t xm_io_poller_insert(lua_State* lua) { // check tb_assert_and_check_return_val(lua, 0); // is user data? - if (!lua_isuserdata(lua, 1)) - return 0; + if (!lua_isuserdata(lua, 2)) + { + lua_pushboolean(lua, tb_false); + lua_pushfstring(lua, "invalid poller object!"); + return 2; + } - // get socket - tb_socket_ref_t sock = (tb_socket_ref_t)lua_touserdata(lua, 1); - tb_check_return_val(sock, 0); + // get otype + tb_size_t otype = (tb_size_t)luaL_checknumber(lua, 1); + + // get cdata + tb_pointer_t cdata = (tb_pointer_t)lua_touserdata(lua, 2); + tb_check_return_val(cdata, 0); // get events - tb_size_t events = (tb_size_t)luaL_checknumber(lua, 2); + tb_size_t events = (tb_size_t)luaL_checknumber(lua, 3); // insert events to poller tb_poller_object_t object; - object.type = TB_POLLER_OBJECT_SOCK; - object.ref.sock = sock; + object.type = otype; + object.ref.ptr = cdata; lua_pushboolean(lua, tb_poller_insert(xm_io_poller(), &object, events, tb_null)); return 1; } diff --git a/core/src/xmake/io/poller_modify.c b/core/src/xmake/io/poller_modify.c index 5fea50938..63a172bc6 100644 --- a/core/src/xmake/io/poller_modify.c +++ b/core/src/xmake/io/poller_modify.c @@ -35,27 +35,34 @@ * interfaces */ -// io.poller_modify(sock, events) +// io.poller_modify(obj:otype(), obj:cdata(), events) tb_int_t xm_io_poller_modify(lua_State* lua) { // check tb_assert_and_check_return_val(lua, 0); // is user data? - if (!lua_isuserdata(lua, 1)) - return 0; + if (!lua_isuserdata(lua, 2)) + { + lua_pushboolean(lua, tb_false); + lua_pushfstring(lua, "invalid poller object!"); + return 2; + } - // get socket - tb_socket_ref_t sock = (tb_socket_ref_t)lua_touserdata(lua, 1); - tb_check_return_val(sock, 0); + // get otype + tb_size_t otype = (tb_size_t)luaL_checknumber(lua, 1); + + // get cdata + tb_pointer_t cdata = (tb_pointer_t)lua_touserdata(lua, 2); + tb_check_return_val(cdata, 0); // get events - tb_size_t events = (tb_size_t)luaL_checknumber(lua, 2); + tb_size_t events = (tb_size_t)luaL_checknumber(lua, 3); // modify events in poller tb_poller_object_t object; - object.type = TB_POLLER_OBJECT_SOCK; - object.ref.sock = sock; + object.type = otype; + object.ref.ptr = cdata; lua_pushboolean(lua, tb_poller_modify(xm_io_poller(), &object, events, tb_null)); return 1; } diff --git a/core/src/xmake/io/poller_remove.c b/core/src/xmake/io/poller_remove.c index 2bce6305d..cd5848a17 100644 --- a/core/src/xmake/io/poller_remove.c +++ b/core/src/xmake/io/poller_remove.c @@ -35,24 +35,31 @@ * interfaces */ -// io.poller_remove(sock) +// io.poller_remove(obj:otype(), obj) tb_int_t xm_io_poller_remove(lua_State* lua) { // check tb_assert_and_check_return_val(lua, 0); // is user data? - if (!lua_isuserdata(lua, 1)) - return 0; + if (!lua_isuserdata(lua, 2)) + { + lua_pushboolean(lua, tb_false); + lua_pushfstring(lua, "invalid poller object!"); + return 2; + } - // get socket - tb_socket_ref_t sock = (tb_socket_ref_t)lua_touserdata(lua, 1); - tb_check_return_val(sock, 0); + // get otype + tb_size_t otype = (tb_size_t)luaL_checknumber(lua, 1); + + // get cdata + tb_pointer_t cdata = (tb_pointer_t)lua_touserdata(lua, 2); + tb_check_return_val(cdata, 0); // remove events from poller tb_poller_object_t object; - object.type = TB_POLLER_OBJECT_SOCK; - object.ref.sock = sock; + object.type = otype; + object.ref.ptr = cdata; lua_pushboolean(lua, tb_poller_remove(xm_io_poller(), &object)); return 1; } diff --git a/core/src/xmake/io/poller_wait.c b/core/src/xmake/io/poller_wait.c index 6b466b565..4d531d68a 100644 --- a/core/src/xmake/io/poller_wait.c +++ b/core/src/xmake/io/poller_wait.c @@ -47,12 +47,14 @@ static tb_void_t xm_io_poller_event(tb_poller_ref_t poller, tb_poller_object_ref // check tb_assert_and_check_return(g_lua); - // save socket and events + // save object and events lua_newtable(g_lua); - lua_pushlightuserdata(g_lua, (tb_pointer_t)object->ref.sock); + lua_pushinteger(g_lua, (tb_int_t)object->type); lua_rawseti(g_lua, -2, 1); - lua_pushinteger(g_lua, (tb_int_t)events); + lua_pushlightuserdata(g_lua, object->ref.ptr); lua_rawseti(g_lua, -2, 2); + lua_pushinteger(g_lua, (tb_int_t)events); + lua_rawseti(g_lua, -2, 3); lua_rawseti(g_lua, -2, ++g_events_count); } diff --git a/xmake/core/base/poller.lua b/xmake/core/base/poller.lua index cfe6096fd..521b63458 100644 --- a/xmake/core/base/poller.lua +++ b/xmake/core/base/poller.lua @@ -25,7 +25,7 @@ local poller = poller or {} local io = require("base/io") local string = require("base/string") --- the poller object type +-- the poller object type, @see tbox/platform/poller.h poller.OT_SOCK = 1 poller.OT_PIPE = 2 poller.OT_PROC = 3 @@ -55,63 +55,6 @@ function poller:_pollerdata_set(cdata, data) pollerdata[cdata] = data end --- insert socket events to poller -function poller:_insert_sock(sock, events, udata) - - -- ensure opened - local ok, errors = sock:_ensure_opened() - if not ok then - return false, errors - end - - -- insert it - if not io.poller_insert(sock:cdata(), events) then - return false, string.format("%s: insert events(%d) to poller failed!", sock, events) - end - - -- save socket data and save sock/ref for gc - self:_pollerdata_set(sock:cdata(), {sock, udata}) - return true -end - --- modify socket events in poller -function poller:_modify_sock(sock, events, udata) - - -- ensure opened - local ok, errors = sock:_ensure_opened() - if not ok then - return false, errors - end - - -- modify it - if not io.poller_modify(sock:cdata(), events) then - return false, string.format("%s: modify events(%d) to poller failed!", sock, events) - end - - -- update socket data for this socket - self:_pollerdata_set(sock:cdata(), {sock, udata}) - return true -end - --- remove socket from poller -function poller:_remove_sock(sock) - - -- ensure opened - local ok, errors = sock:_ensure_opened() - if not ok then - return false, errors - end - - -- remove it - if not io.poller_remove(sock:cdata()) then - return false, string.format("%s: remove events from poller failed!", sock) - end - - -- remove socket data for this socket - self:_pollerdata_set(sock, nil) - return true -end - -- support events? function poller:support(otype, events) if otype == poller.OT_SOCK then @@ -127,29 +70,47 @@ end -- insert object events to poller function poller:insert(obj, events, udata) - if obj:otype() == poller.OT_SOCK then - return self:_insert_sock(obj, events, udata) + + -- insert it + local ok, errors = io.poller_insert(obj:otype(), obj:cdata(), events) + if not ok then + return false, string.format("%s: insert events(%d) to poller failed, error: %s", obj, events, errors or "unknown") end - return false, string.format("invalid poller object type(%d)!", otype) + + -- save poller object data and save obj/ref for gc + self:_pollerdata_set(obj:cdata(), {obj, udata}) + return true end -- modify object events in poller function poller:modify(obj, events, udata) - if obj:otype() == poller.OT_SOCK then - return self:_modify_sock(obj, events, udata) + + -- modify it + local ok, errors = io.poller_modify(obj:otype(), obj:cdata(), events) + if not ok then + return false, string.format("%s: modify events(%d) to poller failed, error: %s", obj, events, errors or "unknown") end - return false, string.format("invalid poller object type(%d)!", otype) + + -- update poller object data + self:_pollerdata_set(obj:cdata(), {obj, udata}) + return true end --- remove socket from poller +-- remove object from poller function poller:remove(obj) - if obj:otype() == poller.OT_SOCK then - return self:_remove_sock(obj) + + -- remove it + local ok, errors = io.poller_remove(obj:otype(), obj:cdata()) + if not ok then + return false, string.format("%s: remove events from poller failed, error: %s", obj, errors or "unknown") end - return false, string.format("invalid poller object type(%d)!", otype) + + -- remove poller object data + self:_pollerdata_set(obj, nil) + return true end --- wait socket events in poller +-- wait object events in poller function poller:wait(timeout) -- wait it @@ -163,18 +124,20 @@ function poller:wait(timeout) return -1, string.format("events(%d) != %d in poller!", #events, count) end - -- wrap socket + -- wrap objects with cdata local results = {} if events then for _, v in ipairs(events) do - -- TODO only socket events now. It will be proc/pipe events in the future - local cdata = v[1] - local sockevents = v[2] + local otype = v[1] + local cdata = v[2] + local events = v[3] local pollerdata = self:_pollerdata(cdata) if not pollerdata then - return -1, string.format("no socket data for cdata(%d)!", cdata) + return -1, string.format("no object data for cdata(%d)!", cdata) end - table.insert(results, {poller.OT_SOCK, pollerdata[1], sockevents, pollerdata[2]}) + local obj = pollerdata[1] + assert(obj and obj:otype() == otype and obj:cdata() == cdata) + table.insert(results, {obj, events, pollerdata[2]}) end end return count, results diff --git a/xmake/core/base/scheduler.lua b/xmake/core/base/scheduler.lua index e4c4a577a..98a63f2c4 100644 --- a/xmake/core/base/scheduler.lua +++ b/xmake/core/base/scheduler.lua @@ -494,18 +494,11 @@ function scheduler:runloop() -- resume all suspended tasks with events for _, e in ipairs(events) do - local otype = e[1] - if otype == poller.OT_SOCK then - local sock = e[2] - local sockevents = e[3] - local sockfunc = e[4] - if sockfunc then - sockfunc(self, sock, sockevents) - end - else - ok = false - errors = string.format("invalid poller object type(%d)", otype) - break + local obj = e[1] + local objevents = e[2] + local eventfunc = e[3] + if eventfunc then + eventfunc(self, obj, objevents) end end |
