summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-01-30 22:48:01 +0800
committerruki <[email protected]>2020-01-30 10:48:06 +0800
commit4cb343a145c152bd3ac3da8704337905408699dc (patch)
tree2948043b2a1d6778e68a7b273feb649879d0e7a0
parente992084750b81a09a56fc0a7c428b3861cfb04dc (diff)
improve core/poller
-rw-r--r--core/src/xmake/io/poller_insert.c25
-rw-r--r--core/src/xmake/io/poller_modify.c25
-rw-r--r--core/src/xmake/io/poller_remove.c23
-rw-r--r--core/src/xmake/io/poller_wait.c8
-rw-r--r--xmake/core/base/poller.lua113
-rw-r--r--xmake/core/base/scheduler.lua17
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