1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-11 14:21:10 +02:00

Adapt run-server* to change to `accept'.

* module/system/repl/server.scm (run-server*): Adapt to new #f return
  value of accept on non-blocking ports.
  (errs-to-retry): Remove variable.
This commit is contained in:
Andy Wingo 2016-10-19 22:28:26 +02:00
parent efcc30fc34
commit 206dced87f

View file

@ -78,15 +78,6 @@
(bind sock AF_UNIX path) (bind sock AF_UNIX path)
sock)) sock))
;; List of errno values from 'select' or 'accept' that should lead to a
;; retry in 'run-server'.
(define errs-to-retry
(delete-duplicates
(filter-map (lambda (name)
(and=> (module-variable the-root-module name)
variable-ref))
'(EINTR EAGAIN EWOULDBLOCK))))
(define* (run-server #:optional (server-socket (make-tcp-server-socket))) (define* (run-server #:optional (server-socket (make-tcp-server-socket)))
(run-server* server-socket serve-client)) (run-server* server-socket serve-client))
@ -107,22 +98,15 @@
shutdown-read-pipe)) shutdown-read-pipe))
(define (accept-new-client) (define (accept-new-client)
(catch #t (let ((ready-ports (car (select monitored-ports '() '()))))
(lambda () ;; If we've been asked to shut down, return #f.
(let ((ready-ports (car (select monitored-ports '() '())))) (and (not (memq shutdown-read-pipe ready-ports))
;; If we've been asked to shut down, return #f. ;; If the socket turns out to actually not be ready, this
(and (not (memq shutdown-read-pipe ready-ports)) ;; will return #f. ECONNABORTED etc are still possible of
(accept server-socket)))) ;; course.
(lambda k-args (or (false-if-exception (accept server-socket)
(let ((err (system-error-errno k-args))) #:warning "Failed to accept client:")
(cond (accept-new-client)))))
((memv err errs-to-retry)
(accept-new-client))
(else
(warn "Error accepting client" k-args)
;; Retry after a timeout.
(sleep 1)
(accept-new-client)))))))
;; Put the socket into non-blocking mode. ;; Put the socket into non-blocking mode.
(fcntl server-socket F_SETFL (fcntl server-socket F_SETFL