summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-12-13 00:49:33 +0800
committerruki <[email protected]>2019-12-12 22:57:18 +0800
commit880b3b96f8222a027b0387bd1bfbbd793267d5a6 (patch)
treee3fc074b54c7e75ccaaadb1a64001139adee8b3f
parent148619a18aea3acbc69523c99468a8315c59d9f2 (diff)
add poller events
-rw-r--r--xmake/core/base/poller.lua30
-rw-r--r--xmake/core/base/scheduler.lua38
-rw-r--r--xmake/core/base/socket.lua2
3 files changed, 50 insertions, 20 deletions
diff --git a/xmake/core/base/poller.lua b/xmake/core/base/poller.lua
index 291125ec2..222081ae7 100644
--- a/xmake/core/base/poller.lua
+++ b/xmake/core/base/poller.lua
@@ -30,19 +30,29 @@ poller.OT_SOCK = 1
poller.OT_PROC = 2
poller.OT_PIPE = 3
--- get socket wait data
-function poller:_sockdata(sock)
- return self._CACHE and self._CACHE[sock] or nil
+-- the poller events, @see tbox/platform/poller.h
+poller.EV_SOCK_RECV = 1
+poller.EV_SOCK_SEND = 2
+poller.EV_SOCK_CONN = poller.EV_SOCK_SEND
+poller.EV_SOCK_ACPT = poller.EV_SOCK_RECV
+poller.EV_SOCK_CLEAR = 0x0010 -- edge trigger. after the event is retrieved by the user, its state is reset
+poller.EV_SOCK_ONESHOT = 0x0010 -- causes the event to return only the first occurrence of the filter being triggered
+poller.EV_SOCK_EOF = 0x0100 -- the event flag will be marked if the connection be closed in the edge trigger
+poller.EV_SOCK_ERROR = 0x0200 -- socket error after waiting
+
+-- get socket data
+function poller:_sockdata(csock)
+ return self._SOCKDATA and self._SOCKDATA[csock] or nil
end
--- set socket wait data
-function poller:_sockdata_set(sock, data)
- local cache = self._CACHE
- if not cache then
- cache = {}
- self._CACHE = cache
+-- set socket data
+function poller:_sockdata_set(csock, data)
+ local sockdata = self._SOCKDATA
+ if not sockdata then
+ sockdata = {}
+ self._SOCKDATA = sockdata
end
- cache[sock] = data
+ sockdata[csock] = data
end
-- insert socket events to poller
diff --git a/xmake/core/base/scheduler.lua b/xmake/core/base/scheduler.lua
index 597643ae2..187b56599 100644
--- a/xmake/core/base/scheduler.lua
+++ b/xmake/core/base/scheduler.lua
@@ -94,6 +94,21 @@ function scheduler:_timer()
return t
end
+-- get socket events
+function scheduler:_sockevents(csock)
+ return self._SOCKEVENTS and self._SOCKEVENTS[csock] or nil
+end
+
+-- set socket events
+function scheduler:_sockevents_set(csock, data)
+ local sockevents = self._SOCKEVENTS
+ if not sockevents then
+ sockevents = {}
+ self._SOCKEVENTS = sockevents
+ end
+ sockevents[csock] = data
+end
+
-- start a new coroutine task
function scheduler:co_start(cotask, ...)
return self:co_start_named(nil, cotask, ...)
@@ -147,18 +162,23 @@ function scheduler:waitsock(sock, events, timeout)
end
-- the socket events callback
- local function sockevents_cb(sockevents)
+ local function sockevents_cb(events)
+
-- TODO
- self:co_resume(running, sockevents)
+ self:co_resume(running, events)
end
- -- add socket events to poller
- -- TODO
-
- -- insert socket to poller for waiting events
- local ok, errors = poller:insert(poller.OT_SOCK, sock, events, sockevents_cb)
- if not ok then
- return -1, errors
+ -- get the previous socket events
+ local events_prev = self:_sockevents(sock:csock())
+ if events_prev then
+ -- TODO
+ print("not impl")
+ else
+ -- insert socket to poller for waiting events
+ local ok, errors = poller:insert(poller.OT_SOCK, sock, events, sockevents_cb)
+ if not ok then
+ return -1, errors
+ end
end
-- register timeout task to timer
diff --git a/xmake/core/base/socket.lua b/xmake/core/base/socket.lua
index 4b459cc39..7497d7b8a 100644
--- a/xmake/core/base/socket.lua
+++ b/xmake/core/base/socket.lua
@@ -38,7 +38,7 @@ socket.ICMP = 3
socket.IPV4 = 1
socket.IPV6 = 2
--- the socket events
+-- the socket events, @see tbox/platform/socket.h
socket.EV_RECV = 1
socket.EV_SEND = 2
socket.EV_CONN = socket.EV_SEND