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

Reply via email to