diff options
Diffstat (limited to 'elymas/lib')
| -rw-r--r-- | elymas/lib/net/alg/server.ey | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey index 882b46f..6dd8d8f 100644 --- a/elymas/lib/net/alg/server.ey +++ b/elymas/lib/net/alg/server.ey @@ -46,29 +46,45 @@ noHandler ==eventHandler ++EPOLLIN ++EPOLLERR bor ==initialFlags + 0 ==closed < { - epoll ++EPOLLCTLDEL fd 0 0 ++ctl +??io.net.epoll -- - fd +close +??io.net.close -- - fd unprotectGC + closed not { + epoll ++EPOLLCTLDEL fd 0 0 ++ctl +??io.net.epoll -- + fd +close +??io.net.close -- + fd unprotectGC + 1 =closed + } rep } /close deffst { ==count - count str .alloc ==buf - fd buf count +read - |close < { 0 } ; =*close > +???io.net.con.read - buf str .inplacePrefix + /read_start dump + closed { "" } { + count str .alloc ==buf + fd buf count +read + |close < { 0 } ; =*close > +???io.net.con.read + buf str .inplacePrefix + } ? * + /read_end dump } /read deff { ==buf - fd buf _ len +write - |close < =*close > +???io.net.con.write + /write_start dump + closed { buf len } { + fd buf _ len +write + |close < =*close > +???io.net.con.write + } ? * + /write_end dump } /write deff { ==flags - eventHandler +!rawAddress noHandler +!rawAddress eq { - flags =initialFlags - } { - epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl +??io.net.epoll -- - } ? * + /ctl_start dump + closed not { + eventHandler +!rawAddress noHandler +!rawAddress eq { + flags =initialFlags + } { + epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl +??io.net.epoll -- + } ? * + } rep + /ctl_end dump } /ctl deffst > ::accept =eventHandler |
