diff options
author | José Bollo <jose.bollo@iot.bzh> | 2017-07-06 10:59:14 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2017-07-11 17:55:17 +0200 |
commit | 4e72c3a2a4e550f99430d1f37a8ef693d2daa8c3 (patch) | |
tree | 9de91a171d6a369e2a508ab8abcc5de237ae1e34 | |
parent | 19af5428bedcac6b4de7a1ac068f49738aeb1e55 (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.txt | 1 | ||||
-rw-r--r-- | src/afb-debug.c | 71 |
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); } } |