diff options
author | José Bollo <jose.bollo@iot.bzh> | 2017-11-07 19:25:15 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2017-11-07 19:25:15 +0100 |
commit | 9fcc6c5d9cb59065e57fa24a80a8912516c8c20c (patch) | |
tree | a61d92e690b739dcf8114fe32233d7826f2ef950 /src/afb-stub-ws.c | |
parent | ef3d8bddfd976643620f56471a4711cd0daa197f (diff) |
afb-stub-ws: manage closed sessions
Change-Id: I16620f12719c222c0da03caf330a865149fe9051
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-stub-ws.c')
-rw-r--r-- | src/afb-stub-ws.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index ce5b8058..d5355ff8 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_active(s->session)) + prv = &s->next; + else { + *prv = s->next; + afb_session_addref(s->session); + free(s); + } + } /* 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); } } |