X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-stub-ws.c;h=e725d5ad6f623af8b8c1218a77c221bebfb0655d;hb=c8558c8a28966110aa3a356f95d3c60afe32b64a;hp=0049c50cf6083e55f344a9cd7ddcb1b44112da54;hpb=b182590a555afe093d2d6e5cdf3e1e2410d1a0f5;p=src%2Fapp-framework-binder.git diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index 0049c50c..e725d5ad 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015, 2016, 2017 "IoT.bzh" + * Copyright (C) 2015-2018 "IoT.bzh" * Author José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -36,8 +36,6 @@ #include -#include "afb-systemd.h" - #include "afb-session.h" #include "afb-cred.h" #include "afb-api.h" @@ -48,6 +46,7 @@ #include "afb-evt.h" #include "afb-xreq.h" #include "verbose.h" +#include "fdev.h" #include "jobs.h" struct afb_stub_ws; @@ -499,14 +498,17 @@ static void record_session(struct afb_stub_ws *stubws, struct afb_session *sessi } } -static void release_sessions(struct afb_stub_ws *stubws) +static void release_all_sessions(struct afb_stub_ws *stubws) { - struct server_session *s; + struct server_session *s, *n; - while((s = stubws->sessions)) { - stubws->sessions = s->next; + s = stubws->sessions; + stubws->sessions = NULL; + while(s) { + n = s->next; afb_session_unref(s->session); free(s); + s = n; } } @@ -655,13 +657,13 @@ static void on_hangup(void *closure) if (stubws->on_hangup) stubws->on_hangup(stubws); - release_sessions(stubws); + release_all_sessions(stubws); afb_stub_ws_unref(stubws); } /*****************************************************/ -static struct afb_stub_ws *afb_stub_ws_create(int fd, const char *apiname, struct afb_apiset *apiset, int client) +static struct afb_stub_ws *afb_stub_ws_create(struct fdev *fdev, const char *apiname, struct afb_apiset *apiset, int client) { struct afb_stub_ws *stubws; @@ -670,10 +672,11 @@ static struct afb_stub_ws *afb_stub_ws_create(int fd, const char *apiname, struc errno = ENOMEM; else { if (client) - stubws->proto = afb_proto_ws_create_client(afb_systemd_get_event_loop(), fd, &client_itf, stubws); + stubws->proto = afb_proto_ws_create_client(fdev, &client_itf, stubws); else - stubws->proto = afb_proto_ws_create_server(afb_systemd_get_event_loop(), fd, &server_itf, stubws); - if (stubws->proto != NULL) { + stubws->proto = afb_proto_ws_create_server(fdev, &server_itf, stubws); + + if (stubws->proto) { strcpy(stubws->apiname, apiname); stubws->apiset = afb_apiset_addref(apiset); stubws->refcount = 1; @@ -682,21 +685,22 @@ static struct afb_stub_ws *afb_stub_ws_create(int fd, const char *apiname, struc } free(stubws); } + fdev_unref(fdev); return NULL; } -struct afb_stub_ws *afb_stub_ws_create_client(int fd, const char *apiname, struct afb_apiset *apiset) +struct afb_stub_ws *afb_stub_ws_create_client(struct fdev *fdev, const char *apiname, struct afb_apiset *apiset) { - return afb_stub_ws_create(fd, apiname, apiset, 1); + return afb_stub_ws_create(fdev, apiname, apiset, 1); } -struct afb_stub_ws *afb_stub_ws_create_server(int fd, const char *apiname, struct afb_apiset *apiset) +struct afb_stub_ws *afb_stub_ws_create_server(struct fdev *fdev, const char *apiname, struct afb_apiset *apiset) { struct afb_stub_ws *stubws; - stubws = afb_stub_ws_create(fd, apiname, apiset, 0); + stubws = afb_stub_ws_create(fdev, apiname, apiset, 0); if (stubws) { - stubws->cred = afb_cred_create_for_socket(fd); + stubws->cred = afb_cred_create_for_socket(fdev_fd(fdev)); stubws->listener = afb_evt_listener_create(&server_evt_itf, stubws); if (stubws->listener != NULL) return stubws; @@ -711,7 +715,7 @@ void afb_stub_ws_unref(struct afb_stub_ws *stubws) drop_all_events(stubws); if (stubws->listener) afb_evt_listener_unref(stubws->listener); - release_sessions(stubws); + release_all_sessions(stubws); afb_proto_ws_unref(stubws->proto); afb_cred_unref(stubws->cred); afb_apiset_unref(stubws->apiset);