X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-stub-ws.c;h=164759271ac9f9d172ca124c59010ff6cacb9bd7;hb=d45426257d5149c735e33e3055220625a919e7bc;hp=ce5b80580bfd0202aee4105875d09906ba3a2a14;hpb=31e2c57e96b6f187ade1bd2aa6672bc4253b84be;p=src%2Fapp-framework-binder.git diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index ce5b8058..16475927 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -474,30 +474,39 @@ static void on_subcall(void *closure, struct afb_proto_ws_subcall *subcall, void static void record_session(struct afb_stub_ws *stubws, struct afb_session *session) { - struct server_session *iter; + struct server_session *s, **prv; /* search */ - for (iter = stubws->sessions ; iter ; iter = iter->next) - if (iter->session == session) + prv = &stubws->sessions; + while ((s = *prv)) { + if (s->session == session) return; + if (afb_session_is_closed(s->session)) { + *prv = s->next; + afb_session_unref(s->session); + free(s); + } + else + prv = &s->next; + } /* create */ - iter = malloc(sizeof *iter); - if (iter) { - iter->session = afb_session_addref(session); - iter->next = stubws->sessions; - stubws->sessions = iter; + s = malloc(sizeof *s); + if (s) { + s->session = afb_session_addref(session); + s->next = stubws->sessions; + stubws->sessions = s; } } static void release_sessions(struct afb_stub_ws *stubws) { - struct server_session *iter; + struct server_session *s; - while((iter = stubws->sessions)) { - stubws->sessions = iter->next; - afb_session_unref(iter->session); - free(iter); + while((s = stubws->sessions)) { + stubws->sessions = s->next; + afb_session_unref(s->session); + free(s); } } @@ -524,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);