aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elymas/lib/net/alg/server.ey91
1 files changed, 48 insertions, 43 deletions
diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey
index d00c9cb..e2314f1 100644
--- a/elymas/lib/net/alg/server.ey
+++ b/elymas/lib/net/alg/server.ey
@@ -28,8 +28,10 @@
< > ==:noHandler
{
- ::port { # ==s
- ::reuseAddr
+ ::port { ==s
+ s ::reuseAddr
+ s +FGETFL 0 +fcntl +??io.net.fcntl.get +ONONBLOCK bor ==flags
+ s +FSETFL flags +fcntl +??io.net.fcntl.set --
} +:listenOptFd _ ::afterListen ==listenFd
[ ] ==allEventHandlers
@@ -43,48 +45,51 @@
<
{
- listenFd +:acceptFd +??io.net.accept ==fd
-
- noHandler ==eventHandler
- ++EPOLLIN ++EPOLLERR bor ==initialFlags
- 0 ==closed
-
- <
- {
- closed not {
- epoll ++EPOLLCTLDEL fd 0 0 ++ctl +??io.net.epoll --
- fd +close +??io.net.close --
- fd unprotectGC
- 1 =closed
- } rep
- } /close deffst
- { ==count
- closed { "" } {
- count str .alloc ==buf
- fd buf count +read
- |close < { 0 } ; =*close > +???io.net.con.read
- buf str .inplacePrefix
- } ? *
- } /read deff
- { ==buf
- closed { buf len } {
- fd buf _ len +write
- |close < =*close > +???io.net.con.write
- } ? *
- } /write deff
- { ==flags
- closed not {
- eventHandler +!rawAddress noHandler +!rawAddress eq {
- flags =initialFlags
- } {
- epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl +??io.net.epoll --
+ listenFd +accept ==fd
+ fd 0 lt {
+ +errno +EAGAIN neq { ??io.net.accept } rep
+ } {
+ noHandler ==eventHandler
+ ++EPOLLIN ++EPOLLERR bor ==initialFlags
+ 0 ==closed
+
+ <
+ {
+ closed not {
+ epoll ++EPOLLCTLDEL fd 0 0 ++ctl +??io.net.epoll --
+ fd +close +??io.net.close --
+ fd unprotectGC
+ 1 =closed
+ } rep
+ } /close deffst
+ { ==count
+ closed { "" } {
+ count str .alloc ==buf
+ fd buf count +read
+ |close < { 0 } ; =*close > +???io.net.con.read
+ buf str .inplacePrefix
} ? *
- } rep
- } /ctl deffst
- > ::accept =eventHandler
-
- epoll ++EPOLLCTLADD fd initialFlags eventHandler +!rawAddress ++ctl +??io.net.epoll --
- eventHandler fd protectGC
+ } /read deff
+ { ==buf
+ closed { buf len } {
+ fd buf _ len +write
+ |close < =*close > +???io.net.con.write
+ } ? *
+ } /write deff
+ { ==flags
+ closed not {
+ eventHandler +!rawAddress noHandler +!rawAddress eq {
+ flags =initialFlags
+ } {
+ epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl +??io.net.epoll --
+ } ? *
+ } rep
+ } /ctl deffst
+ > ::accept =eventHandler
+
+ epoll ++EPOLLCTLADD fd initialFlags eventHandler +!rawAddress ++ctl +??io.net.epoll --
+ eventHandler fd protectGC
+ } ? *
} =*in
{ "unexpected output capability on listening socket" die } =*out
{ ??io.net } =*err