#include <afb/afb-event.h>
-#include "afb-common.h"
+#include "afb-systemd.h"
#include "afb-session.h"
#include "afb-cred.h"
while ((s = *prv)) {
if (s->session == session)
return;
- if (afb_session_is_active(s->session))
- prv = &s->next;
- else {
+ if (afb_session_is_closed(s->session)) {
*prv = s->next;
- afb_session_addref(s->session);
+ afb_session_unref(s->session);
free(s);
}
+ else
+ prv = &s->next;
}
/* create */
goto unconnected;
wreq->xreq.context.validated = 1;
record_session(stubws, wreq->xreq.context.session);
+ if (wreq->xreq.context.created)
+ afb_session_set_autoclose(wreq->xreq.context.session, 1);
/* makes the call */
wreq->xreq.cred = afb_cred_addref(stubws->cred);
{
struct afb_stub_ws *stubws = closure;
+ afb_stub_ws_addref(stubws);
if (stubws->on_hangup)
stubws->on_hangup(stubws);
release_sessions(stubws);
+ afb_stub_ws_unref(stubws);
}
/*****************************************************/
errno = ENOMEM;
else {
if (client)
- stubws->proto = afb_proto_ws_create_client(afb_common_get_event_loop(), fd, &client_itf, stubws);
+ stubws->proto = afb_proto_ws_create_client(afb_systemd_get_event_loop(), fd, &client_itf, stubws);
else
- stubws->proto = afb_proto_ws_create_server(afb_common_get_event_loop(), fd, &server_itf, stubws);
+ stubws->proto = afb_proto_ws_create_server(afb_systemd_get_event_loop(), fd, &server_itf, stubws);
if (stubws->proto != NULL) {
strcpy(stubws->apiname, apiname);
stubws->apiset = afb_apiset_addref(apiset);
{
if (!__atomic_sub_fetch(&stubws->refcount, 1, __ATOMIC_RELAXED)) {
drop_all_events(stubws);
- afb_evt_listener_unref(stubws->listener);
+ if (stubws->listener)
+ afb_evt_listener_unref(stubws->listener);
release_sessions(stubws);
afb_proto_ws_unref(stubws->proto);
afb_cred_unref(stubws->cred);