kill -SIGUSR2 <radiusd> now prints talloc memory report to logging FD
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 25 Apr 2014 14:44:18 +0000 (15:44 +0100)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 25 Apr 2014 14:45:43 +0000 (15:45 +0100)
src/include/libradius.h
src/include/log.h
src/lib/debug.c
src/main/log.c
src/main/radattr.c
src/main/radiusd.c
src/main/unittest.c
src/main/valuepair.c

index 11f923d..d1dfb64 100644 (file)
@@ -777,6 +777,7 @@ fr_bt_marker_t      *fr_backtrace_attach(fr_cbuff_t **cbuff, TALLOC_CTX *obj);
 
 int            fr_set_dumpable_init(void);
 int            fr_set_dumpable(bool allow_core_dumps);
+int            fr_log_talloc_report(TALLOC_CTX *ctx, int fd);
 void           fr_fault(int sig);
 int            fr_fault_setup(char const *cmd, char const *program);
 void           fr_fault_set_cb(fr_fault_cb cb);
index dcc4241..f27bdbc 100644 (file)
@@ -110,7 +110,6 @@ void radlog_request_marker(log_type_t type, log_debug_t lvl, REQUEST *request,
                           char const *fmt, size_t indent, char const *error);
 
 void log_talloc(char const *message);
-void log_talloc_report(TALLOC_CTX *ctx);
 
 /*
  *     Multiple threads logging to one or more files.
index 78f29f2..9ad3b90 100644 (file)
@@ -311,6 +311,51 @@ int fr_set_dumpable(bool allow_core_dumps)
        return 0;
 }
 
+/** Generate a talloc memory report for a context and print to stderr/stdout
+ *
+ * @param ctx to generate a report for, may be NULL in which case the root context is used.
+ */
+int fr_log_talloc_report(TALLOC_CTX *ctx, int fd)
+{
+       FILE *handle;
+       char const *null_ctx = NULL;
+       int i = 0;
+
+       handle = fdopen(fd, "w");
+       if (!handle) {
+               fr_strerror_printf("Couldn't write memory report, fdopen failed: %s", fr_syserror(errno));
+
+               return -1;
+       }
+
+       if (ctx) {
+               null_ctx = talloc_get_name(NULL);
+       }
+
+       if (!ctx) {
+               talloc_report_full(NULL, handle);
+       } else do {
+               fprintf(handle, "Context level %i", i++);
+
+               talloc_report_full(ctx, handle);
+       } while ((ctx = talloc_parent(ctx)) && (talloc_get_name(ctx) != null_ctx));  /* Stop before we hit NULL ctx */
+
+       fclose(handle);
+
+       return 0;
+}
+
+/** Signal handler to print out a talloc memory report
+ *
+ * @param sig caught
+ */
+static void fr_fault_memory_report(int sig)
+{
+       fprintf(stderr, "CAUGHT SIGNAL: %s\n", strsignal(sig));
+
+       fr_log_talloc_report(NULL, STDERR_FILENO);
+}
+
 /** Check to see if panic_action file is world writeable
  *
  * @return 0 if file is OK, else -1.
@@ -435,9 +480,6 @@ skip_backtrace:
        if (sig == SIGUSR1) return;
 #endif
 
-#ifdef SIGUSR2
-       if (sig == SIGUSR2) return;
-#endif
        fr_exit_now(1);
 }
 
@@ -521,7 +563,7 @@ int fr_fault_setup(char const *cmd, char const *program)
 #endif
 
 #ifdef SIGUSR2
-               if (fr_set_signal(SIGUSR2, fr_fault) < 0) return -1;
+               if (fr_set_signal(SIGUSR2, fr_fault_memory_report) < 0) return -1;
 #endif
        }
        setup = true;
index d529df9..b705947 100644 (file)
@@ -717,36 +717,6 @@ void log_talloc(char const *msg)
        INFO("%s", msg);
 }
 
-void log_talloc_report(TALLOC_CTX *ctx)
-{
-       FILE *fd;
-       char const *null_ctx = NULL;
-       int i = 0;
-
-       if (ctx) {
-               null_ctx = talloc_get_name(NULL);
-       }
-
-       fd = fdopen(default_log.fd, "w");
-       if (!fd) {
-               ERROR("Couldn't write memory report, fdopen failed: %s", fr_syserror(errno));
-
-               return;
-       }
-
-       if (!ctx) {
-               talloc_report_full(NULL, fd);
-       } else {
-               do {
-                       INFO("Context level %i", i++);
-
-                       talloc_report_full(ctx, fd);
-               } while ((ctx = talloc_parent(ctx)) && (talloc_get_name(ctx) != null_ctx));  /* Stop before we hit NULL ctx */
-       }
-
-       fclose(fd);
-}
-
 typedef struct fr_logfile_entry_t {
        int             fd;
        int             dup;
index 2a10aca..8a040a0 100644 (file)
@@ -885,7 +885,7 @@ int main(int argc, char *argv[])
 
        if (report) {
                dict_free();
-               log_talloc_report(NULL);
+               fr_log_talloc_report(NULL, default_log.fd);
        }
 
        return 0;
index c3efefa..327410a 100644 (file)
@@ -618,7 +618,7 @@ cleanup:
 
        if (mainconfig.memory_report) {
                INFO("Allocated memory at time of report:");
-               log_talloc_report(NULL);
+               fr_log_talloc_report(NULL, default_log.fd);
        }
 
        return rcode;
index 0d7fdd9..8f9d6ef 100644 (file)
@@ -325,7 +325,7 @@ static REQUEST *request_setup(FILE *fp)
                        if (!talloc_get_type(vp, VALUE_PAIR)) {
                                ERROR("Expected VALUE_PAIR pointer got \"%s\"", talloc_get_name(vp));
 
-                               log_talloc_report(vp);
+                               fr_log_talloc_report(vp, default_log.fd);
                                rad_assert(0);
                        }
 
@@ -384,7 +384,7 @@ static void print_packet(FILE *fp, RADIUS_PACKET *packet)
                if (!talloc_get_type(vp, VALUE_PAIR)) {
                        ERROR("Expected VALUE_PAIR pointer got \"%s\"", talloc_get_name(vp));
 
-                       log_talloc_report(vp);
+                       fr_log_talloc_report(vp, default_log.fd);
                        rad_assert(0);
                }
 
@@ -663,7 +663,7 @@ int main(int argc, char *argv[])
 
        if (memory_report) {
                INFO("Allocated memory at time of report:");
-               log_talloc_report(NULL);
+               fr_log_talloc_report(NULL, default_log.fd);
        }
 
        return rcode;
index ae65281..0a2fb49 100644 (file)
@@ -701,7 +701,7 @@ void rdebug_pair_list(int level, REQUEST *request, VALUE_PAIR *vp)
                if (!talloc_get_type(vp, VALUE_PAIR)) {
                        REDEBUG("Expected VALUE_PAIR pointer got \"%s\"", talloc_get_name(vp));
 
-                       log_talloc_report(vp);
+                       fr_log_talloc_report(vp, default_log.fd);
                        rad_assert(0);
                }