diff options
Diffstat (limited to 'examples/memcached-server.scm')
| -rw-r--r-- | examples/memcached-server.scm | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/examples/memcached-server.scm b/examples/memcached-server.scm index 26cca5d..3761cc0 100644 --- a/examples/memcached-server.scm +++ b/examples/memcached-server.scm @@ -24,16 +24,12 @@ (ice-9 rdelim) (ice-9 match)) -(define (set-nonblocking! port) - (fcntl port F_SETFL (logior O_NONBLOCK (fcntl port F_GETFL))) - (setvbuf port 'block 1024)) - (define (make-default-socket family addr port) (let ((sock (socket PF_INET SOCK_STREAM 0))) (setsockopt sock SOL_SOCKET SO_REUSEADDR 1) (fcntl sock F_SETFD FD_CLOEXEC) (bind sock family addr port) - (set-nonblocking! sock) + (fcntl sock F_SETFL (logior O_NONBLOCK (fcntl sock F_GETFL))) sock)) (define (client-error port msg . args) @@ -103,6 +99,9 @@ (put-string port "STORED\r\n"))) (define (client-loop port addr store) + ;; Disable Nagle's algorithm. We buffer ourselves. + (setsockopt port IPPROTO_TCP TCP_NODELAY 1) + (setvbuf port 'block 1024) (let loop () ;; TODO: Restrict read-line to 512 chars. (let ((line (read-line port))) @@ -120,16 +119,13 @@ (loop))) (else (client-error port "Bad command line" line)))))))) -;; todo: accept and connect (define (socket-loop socket store) (let loop () - (match (accept socket) + (match (accept socket SOCK_NONBLOCK) ((client . addr) - (set-nonblocking! client) - ;; Disable Nagle's algorithm. We buffer ourselves. - (setsockopt client IPPROTO_TCP TCP_NODELAY 0) (spawn-fiber - (lambda () (client-loop client addr store))) + (lambda () (client-loop client addr store)) + #:parallel? #t) (loop))))) (define* (run-memcached #:key @@ -140,7 +136,7 @@ INADDR_LOOPBACK)) (port 11211) (socket (make-default-socket family addr port))) - (listen socket 128) + (listen socket 1024) (sigaction SIGPIPE SIG_IGN) (socket-loop socket (make-hash-table))) |
