diff options
| author | ruki <[email protected]> | 2019-12-13 00:49:33 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-12-12 22:57:18 +0800 |
| commit | 880b3b96f8222a027b0387bd1bfbbd793267d5a6 (patch) | |
| tree | e3fc074b54c7e75ccaaadb1a64001139adee8b3f | |
| parent | 148619a18aea3acbc69523c99468a8315c59d9f2 (diff) | |
add poller events
| -rw-r--r-- | xmake/core/base/poller.lua | 30 | ||||
| -rw-r--r-- | xmake/core/base/scheduler.lua | 38 | ||||
| -rw-r--r-- | xmake/core/base/socket.lua | 2 |
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 |
