- if (writebuf_char(&wb, CHAR_FOR_EVT_BROADCAST) && writebuf_string(&wb, event) && writebuf_object(&wb, object)) {
- rc = afb_ws_binary_v(stubws->ws, wb.iovec, wb.count);
- if (rc < 0)
- ERROR("error while broadcasting event %s", event);
- } else
- ERROR("error while broadcasting event %s", event);
- json_object_put(object);
+ afb_proto_ws_unref(__atomic_exchange_n(&stubws->proto, NULL, __ATOMIC_RELAXED));
+ if (stubws->is_client) {
+ i2p = __atomic_exchange_n(&stubws->event_proxies, NULL, __ATOMIC_RELAXED);
+ if (i2p) {
+ u16id2ptr_forall(i2p, release_all_events_cb, NULL);
+ u16id2ptr_destroy(&i2p);
+ }
+ i2b = __atomic_exchange_n(&stubws->session_flags, NULL, __ATOMIC_RELAXED);
+ u16id2bool_destroy(&i2b);
+ i2b = __atomic_exchange_n(&stubws->token_flags, NULL, __ATOMIC_RELAXED);
+ u16id2bool_destroy(&i2b);
+ } else {
+ afb_evt_listener_unref(__atomic_exchange_n(&stubws->listener, NULL, __ATOMIC_RELAXED));
+ afb_cred_unref(__atomic_exchange_n(&stubws->cred, NULL, __ATOMIC_RELAXED));
+ i2b = __atomic_exchange_n(&stubws->event_flags, NULL, __ATOMIC_RELAXED);
+ u16id2bool_destroy(&i2b);
+ i2p = __atomic_exchange_n(&stubws->session_proxies, NULL, __ATOMIC_RELAXED);
+ if (i2p) {
+ u16id2ptr_forall(i2p, release_all_sessions_cb, NULL);
+ u16id2ptr_destroy(&i2p);
+ }
+ i2p = __atomic_exchange_n(&stubws->token_proxies, NULL, __ATOMIC_RELAXED);
+ if (i2p) {
+ u16id2ptr_forall(i2p, release_all_tokens_cb, NULL);
+ u16id2ptr_destroy(&i2p);
+ }
+ }