X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-supervision.c;h=f41ca18b53b3dd74eb78ddfe5586346a6257bc2d;hb=6e7f3d28a2d08a8976fdd9c586b4cbddcaeb37bd;hp=a7099a4a87a50ee3698bc535f38531c5b3b81e3e;hpb=b8c9d5de384efcfa53ebdb3f0053d7b3723777e1;p=src%2Fapp-framework-binder.git diff --git a/src/afb-supervision.c b/src/afb-supervision.c index a7099a4a..f41ca18b 100644 --- a/src/afb-supervision.c +++ b/src/afb-supervision.c @@ -38,15 +38,19 @@ #include "afb-xreq.h" #include "afb-trace.h" #include "afb-session.h" +#include "afb-config.h" #include "afb-supervision.h" #include "afs-supervision.h" #include "afb-stub-ws.h" #include "afb-debug.h" #include "verbose.h" #include "wrap-json.h" +#include "jobs.h" + +extern struct afb_config *main_config; /* api and apiset name */ -static const char supervision_apiname[] = AFS_SURPERVISION_APINAME; +static const char supervision_apiname[] = AFS_SURPERVISION_APINAME_INTERNAL; /* path of the supervision socket */ static const char supervisor_socket_path[] = AFS_SURPERVISION_SOCKET; @@ -108,20 +112,24 @@ static int open_supervisor_socket(const char *path) return fd; } -static void cleanup_supervisor(void *nada) +static void disconnect_supervisor() { - struct afb_trace *t = __atomic_exchange_n(&trace, NULL, __ATOMIC_RELAXED); + struct afb_stub_ws *s; + struct afb_trace *t; + + INFO("Disconnecting supervision"); + s = __atomic_exchange_n(&supervisor, NULL, __ATOMIC_RELAXED); + t = __atomic_exchange_n(&trace, NULL, __ATOMIC_RELAXED); + if (s) + afb_stub_ws_unref(s); if (t) afb_trace_unref(t); - supervisor = NULL; } -static void disconnect_supervisor() +static void on_supervisor_hangup(struct afb_stub_ws *s) { - struct afb_stub_ws *s = __atomic_exchange_n(&supervisor, NULL, __ATOMIC_RELAXED); - - if (s) - afb_stub_ws_unref(s); + if (s && s == supervisor) + disconnect_supervisor(); } /* try to connect to supervisor */ @@ -192,6 +200,7 @@ static void try_connect_supervisor() ERROR("Creation of supervisor failed: %m"); goto end2; } + afb_stub_ws_on_hangup(supervisor, on_supervisor_hangup); /* successful termination */ goto end; @@ -202,11 +211,18 @@ end: pthread_mutex_unlock(&mutex); } -static void on_sighup(int signum) +static void try_connect_supervisor_job(int signum, void *args) { + INFO("Try to connect supervisor after SIGHUP"); try_connect_supervisor(); } +static void on_sighup(int signum) +{ + INFO("Supervision received a SIGHUP"); + jobs_queue(NULL, 0, try_connect_supervisor_job, NULL); +} + /** * initalize the supervision */ @@ -265,8 +281,8 @@ static void slist(void *closure, struct afb_session *session) ******************************************************************************/ static const char *verbs[] = { - "break", "do", "exit", "sclose", "slist", "trace", "wait" }; -enum { Break , Do , Exit , Sclose , Slist , Trace , Wait }; + "break", "config", "do", "exit", "sclose", "slist", "trace", "wait" }; +enum { Break , Config , Do , Exit , Sclose , Slist , Trace , Wait }; static void on_supervision_call(void *closure, struct afb_xreq *xreq) @@ -319,6 +335,9 @@ static void on_supervision_call(void *closure, struct afb_xreq *xreq) afb_session_foreach(slist, list); afb_xreq_success(xreq, list, NULL); break; + case Config: + afb_xreq_success(xreq, afb_config_json(main_config), NULL); + break; case Trace: if (!trace) trace = afb_trace_create(supervision_apiname, NULL /* not bound to any session */);