struct afb_stub_ws;
-/*
- * structure for recording calls on client side
- */
-struct client_call {
- struct client_call *next; /* the next call */
- struct afb_stub_ws *stubws; /* the stub_ws */
- struct afb_xreq *xreq; /* the request handle */
- uint32_t msgid; /* the message identifier */
-};
-
/*
* structure for a ws request
*/
/* on call, propagate it to the ws service */
static void client_call_cb(void * closure, struct afb_xreq *xreq)
{
+ int rc;
struct afb_stub_ws *stubws = closure;
- afb_proto_ws_client_call(
+ rc = afb_proto_ws_client_call(
stubws->proto,
xreq->request.called_verb,
afb_xreq_json(xreq),
afb_session_uuid(xreq->context.session),
xreq,
xreq_on_behalf_cred_export(xreq));
- afb_xreq_unhooked_addref(xreq);
+ if (rc >= 0)
+ afb_xreq_unhooked_addref(xreq);
+ else
+ afb_xreq_reply(xreq, NULL, "internal", "can't send message");
}
static void client_on_description_cb(void *closure, struct json_object *data)
{
struct server_session *s, *n;
- s = stubws->sessions;
- stubws->sessions = NULL;
+ s = __atomic_exchange_n(&stubws->sessions, NULL, __ATOMIC_RELAXED);
while(s) {
n = s->next;
afb_session_unref(s->session);
__atomic_add_fetch(&stubws->refcount, 1, __ATOMIC_RELAXED);
}
-void afb_stub_ws_on_hangup(struct afb_stub_ws *stubws, void (*on_hangup)(struct afb_stub_ws*))
+void afb_stub_ws_set_on_hangup(struct afb_stub_ws *stubws, void (*on_hangup)(struct afb_stub_ws*))
{
stubws->on_hangup = on_hangup;
}