X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-stub-ws.c;h=036b4943aee03319cebd4fc2197e1dca2248b61f;hb=6e7f3d28a2d08a8976fdd9c586b4cbddcaeb37bd;hp=d5355ff804595ee02b59021529868b98a7c1c7e5;hpb=9fcc6c5d9cb59065e57fa24a80a8912516c8c20c;p=src%2Fapp-framework-binder.git diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index d5355ff8..036b4943 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -481,13 +481,13 @@ static void record_session(struct afb_stub_ws *stubws, struct afb_session *sessi 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 */ @@ -533,6 +533,8 @@ static void on_call(void *closure, struct afb_proto_ws_call *call, const char *v 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); @@ -649,10 +651,12 @@ static void on_hangup(void *closure) { 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); } /*****************************************************/ @@ -705,7 +709,8 @@ void afb_stub_ws_unref(struct afb_stub_ws *stubws) { 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);