summaryrefslogtreecommitdiffstats
path: root/src/afb-stub-ws.c
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-11-07 19:25:15 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2017-11-07 19:25:15 +0100
commit9fcc6c5d9cb59065e57fa24a80a8912516c8c20c (patch)
treea61d92e690b739dcf8114fe32233d7826f2ef950 /src/afb-stub-ws.c
parentef3d8bddfd976643620f56471a4711cd0daa197f (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.c35
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);
}
}