From b2114e0f626ed42a5d6154c681486b4edb19fbbf Mon Sep 17 00:00:00 2001 From: José Bollo Date: Thu, 6 Jul 2017 10:59:14 +0200 Subject: debug: Create a file indicating the waiting point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When AFB_DEBUG_WAIT is used, the file /tmp/afb-debug- 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: I5c896e4d9a3a098affc18d4282e260d9bb253611 Signed-off-by: José Bollo --- src/CMakeLists.txt | 1 + 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 #include +#include +#include +#include +#include +#include + #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); } } -- cgit 1.2.3-korg