diff options
author | Ori Bernstein <ori@eigenstate.org> | 2017-09-10 21:38:47 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2017-09-10 21:38:47 -0700 |
commit | dd8235ce6d9c45e7039a821bdc86818c63c2823d (patch) | |
tree | 1e8bb7a2036edf082931253e509f1dcb54564e69 /lib/http/server.myr | |
parent | d09137d7087bb2909f1e8ee02a098c44e42958ab (diff) | |
download | mc-dd8235ce6d9c45e7039a821bdc86818c63c2823d.tar.gz |
Refcount the HTTP server.
Diffstat (limited to 'lib/http/server.myr')
-rw-r--r-- | lib/http/server.myr | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/http/server.myr b/lib/http/server.myr index e6c1923..8b221bd 100644 --- a/lib/http/server.myr +++ b/lib/http/server.myr @@ -25,18 +25,24 @@ const announce = {ds | `std.Err e: -> `std.Err `Econn | `std.Ok lfd: std.close(afd) - -> `std.Ok std.mk([.lfd=lfd]) + -> `std.Ok std.mk([ + .refs=1, + .lfd=lfd, + .quit=false + ]) ;; } const serve = {srv, fn - while true + while !srv.quit match waitconn(srv) - | `std.Ok fd: + | `std.Ok fd: + ref(srv) thread.spawn({;communicate(srv, fd, fn)}) | `std.Err e: /* eh? */ ;; ;; + unref(srv) } const communicate = {srv, fd, fn @@ -50,6 +56,7 @@ const communicate = {srv, fd, fn ;; ;; std.close(fd) + unref(srv) } const respond = {srv, s, resp @@ -78,6 +85,8 @@ const statusstr = {st const shutdown = {srv std.close(srv.lfd) + srv.quit = true + } @@ -88,3 +97,14 @@ const waitconn = {srv ;; } + +const ref = {srv + thread.xadd(&srv.refs, 1) +} + +const unref = {srv + thread.xadd(&srv.refs, -1) + if thread.xget(&srv.refs) == 0 + std.free(srv) + ;; +} |