Hi Ludovic, > --- a/runtime/websocket.scm > +++ b/runtime/websocket.scm > @@@ -469,16 +469,17 @@@ > (define (close) > (with-access::websocket ws (%mutex %socket oncloses state) > (synchronize %mutex > - (when (pair? oncloses) > - (set! state 'closing) > - (let ((se (instantiate::websocket-event > - (name "close") > - (target ws) > - (value ws)))) > - (apply-listeners oncloses se))) > - (set! state 'closed) > - (socket-close %socket) > - (set! %socket #f)))) > + (unless (eq? state 'closed) > + (when (pair? oncloses) > + (set! state 'closing) > + (let ((se (instantiate::websocket-event > + (name "close") > + (target ws) > + (value ws)))) > + (apply-listeners oncloses se))) > + (set! state 'closed) > + (socket-close %socket) > + (set! %socket #f))))) > > (define (abort) > (with-access::websocket ws (%mutex %socket onerrors) I'm not sure this one is fully correct. If it exists a pattern that could lead of the listeners to invoke close recursively the fix is incomplete. I think that replacing the test (eq? state 'closed)
with (memq state '(closing closed)) would solve the problem. Do you agree? -- Manuel