#include "afb-debug.h"
#include "verbose.h"
#include "wrap-json.h"
+#include "jobs.h"
extern struct afb_config *main_config;
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 */
ERROR("Creation of supervisor failed: %m");
goto end2;
}
+ afb_stub_ws_on_hangup(supervisor, on_supervisor_hangup);
/* successful termination */
goto 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
*/