summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-07-06 10:59:14 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2017-07-11 17:55:17 +0200
commit4e72c3a2a4e550f99430d1f37a8ef693d2daa8c3 (patch)
tree9de91a171d6a369e2a508ab8abcc5de237ae1e34
parent19af5428bedcac6b4de7a1ac068f49738aeb1e55 (diff)
debug: Create a file indicating the waiting point
When AFB_DEBUG_WAIT is used, the file /tmp/afb-debug-<PID> is created and contains the name of the awaiting point (without tailing new line) Signals other than SIGINT are ignored when waiting for SIGINT. This improves the cleaning up. Example: the signal SIGTERM is delayed until after removal of the debugging indication file. Change-Id: Iea163f87e160f9a99bc10f7365920893752bd308 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/afb-debug.c71
2 files changed, 50 insertions, 22 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 31fcd519..7d2db4a5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -28,6 +28,7 @@ ADD_SUBDIRECTORY(tests)
ADD_DEFINITIONS(-DBINDING_INSTALL_DIR="${binding_install_dir}")
# Always add INFER_EXTENSION (more details in afb-hreq.c)
ADD_DEFINITIONS(-DINFER_EXTENSION)
+ADD_DEFINITIONS(-DAGL_DEVEL)
ADD_LIBRARY(afb-lib STATIC
afb-api.c
diff --git a/src/afb-debug.c b/src/afb-debug.c
index 5817f17e..228f710e 100644
--- a/src/afb-debug.c
+++ b/src/afb-debug.c
@@ -25,12 +25,22 @@
#include <string.h>
#include <signal.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
#include "verbose.h"
static char key_env_break[] = "AFB_DEBUG_BREAK";
static char key_env_wait[] = "AFB_DEBUG_WAIT";
static char separs[] = ", \t\n";
+/*
+ * Checks whether the 'key' is in the 'list'
+ * Return 1 if it is in or 0 otherwise
+ */
static int has_key(const char *key, const char *list)
{
if (list && key) {
@@ -46,39 +56,56 @@ static int has_key(const char *key, const char *list)
return 0;
}
+static void indicate(const char *key)
+{
+#if !defined(NO_AFB_DEBUG_FILE_INDICATION)
+ char filename[200];
+ int fd;
+
+ snprintf(filename, sizeof filename, "/tmp/afb-debug-%ld", (long)getpid());
+ if (key) {
+ fd = creat(filename, 0644);
+ write(fd, key, strlen(key));
+ close(fd);
+ } else {
+ unlink(filename);
+ }
+#endif
+}
+
static void handler(int signum)
{
}
void afb_debug(const char *key)
{
- enum { None, Break, Wait } action;
+ struct sigaction sa, psa;
+ sigset_t ss, oss;
- if (has_key(key, secure_getenv(key_env_break)))
- action = Break;
- else if (has_key(key, secure_getenv(key_env_wait)))
- action = Wait;
- else
- action = None;
-
- if (action != None) {
- const char *a = action == Break ? "BREAK" : "WAIT";
- struct sigaction sa, psa;
- sigset_t ss;
-
- NOTICE("DEBUG %s before %s", a, key);
+ if (has_key(key, secure_getenv(key_env_break))) {
+ NOTICE("DEBUG BREAK before %s", key);
memset(&sa, 0, sizeof sa);
sa.sa_handler = handler;
sigaction(SIGINT, &sa, &psa);
- if (action == Break) {
- raise(SIGINT);
- } else {
- sigemptyset(&ss);
- sigaddset(&ss, SIGINT);
- sigwaitinfo(&ss, NULL);
- }
+ raise(SIGINT);
+ sigaction(SIGINT, &psa, NULL);
+ NOTICE("DEBUG BREAK after %s", key);
+ } else if (has_key(key, secure_getenv(key_env_wait))) {
+ NOTICE("DEBUG WAIT before %s", key);
+ sigfillset(&ss);
+ sigdelset(&ss, SIGINT);
+ sigprocmask(SIG_SETMASK, &ss, &oss);
+ sigemptyset(&ss);
+ sigaddset(&ss, SIGINT);
+ memset(&sa, 0, sizeof sa);
+ sa.sa_handler = handler;
+ sigaction(SIGINT, &sa, &psa);
+ indicate(key);
+ sigwaitinfo(&ss, NULL);
sigaction(SIGINT, &psa, NULL);
- NOTICE("DEBUG %s after %s", a, key);
+ indicate(NULL);
+ sigprocmask(SIG_SETMASK, &oss, NULL);
+ NOTICE("DEBUG WAIT after %s", key);
}
}