manuel.serr...@inria.fr skribis: >> --- 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?
Yes, that makes sense. Ludo’.