summaryrefslogtreecommitdiff
path: root/examples/memcached-server.scm
diff options
context:
space:
mode:
Diffstat (limited to 'examples/memcached-server.scm')
-rw-r--r--examples/memcached-server.scm20
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)))