aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/net/alg
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2017-03-20 19:42:14 +0100
committerDrahflow <drahflow@gmx.de>2017-03-20 19:42:14 +0100
commitc24bc459336bb3174ea0bf766f94e191935395df (patch)
treedf978f597abc1f1587eef4ed9aedd009528ffc76 /elymas/lib/net/alg
parent12de6a36d46bf82202d069c13d0a2555ebd96aa7 (diff)
Correctly participate in thundering herd
Diffstat (limited to 'elymas/lib/net/alg')
-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