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’.

Reply via email to