Software /
code /
prosody
Diff
net/server_select.lua @ 8781:53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 09 May 2018 16:15:40 +0200 |
parent | 8749:fb3cd6b2263b |
child | 8983:23f66f04e216 |
line wrap: on
line diff
--- a/net/server_select.lua Mon May 07 22:10:29 2018 +0200 +++ b/net/server_select.lua Wed May 09 16:15:40 2018 +0200 @@ -1034,6 +1034,48 @@ end end +local closewatcher = function (handler) + local socket = handler.conn; + _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) + _readlistlen = removesocket( _readlist, socket, _readlistlen ) + _socketlist[ socket ] = nil +end; + +local addremove = function (handler, read, send) + local socket = handler.conn + _socketlist[ socket ] = handler + if read ~= nil then + if read then + _readlistlen = addsocket( _readlist, socket, _readlistlen ) + else + _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) + end + end + if send ~= nil then + if send then + _sendlistlen = addsocket( _sendlist, socket, _sendlistlen ) + else + _readlistlen = removesocket( _readlist, socket, _readlistlen ) + end + end +end + +local watchfd = function ( fd, onreadable, onwriteable ) + local socket = fd + if type(fd) == "number" then + socket = { getfd = function () return fd; end } + end + local handler = { + conn = socket; + readbuffer = onreadable or id; + sendbuffer = onwriteable or id; + close = closewatcher; + setflags = addremove; + }; + addremove( handler, onreadable, onwriteable ) + return handler +end + ----------------------------------// BEGIN //-- use "setmetatable" ( _socketlist, { __mode = "k" } ) @@ -1058,6 +1100,7 @@ addclient = addclient, wrapclient = wrapclient, + watchfd = watchfd, loop = loop, link = link,