astfd: Adds a timestamp for each entry.
authorAlexander Traud <pabstraud@compuserve.com>
Sat, 19 Sep 2015 17:49:46 +0000 (19:49 +0200)
committerAlexander Traud <pabstraud@compuserve.com>
Sat, 19 Sep 2015 17:52:36 +0000 (19:52 +0200)
Now with menuselect "DEBUG_FD_LEAKS" and CLI "core show fd", a timestamp is
shown with each file descriptor. This helps to debug leaked UDP/TCP ports on
long-lived servers, for example.

ASTERISK-25405 #close

Change-Id: I968339e5155a512eba1032a5263f1ec8b5e1f80b

main/astfd.c

index 7467376..d1879f0 100644 (file)
@@ -46,6 +46,8 @@ ASTERISK_REGISTER_FILE()
 #include "asterisk/lock.h"
 #include "asterisk/strings.h"
 #include "asterisk/unaligned.h"
+#include "asterisk/localtime.h"
+#include "asterisk/time.h"
 
 static struct fdleaks {
        const char *callname;
@@ -54,6 +56,7 @@ static struct fdleaks {
        char file[40];
        char function[25];
        char callargs[60];
+       struct timeval now;
 } fdleaks[1024] = { { "", }, };
 
 /* COPY does ast_copy_string(dst, src, sizeof(dst)), except:
@@ -79,6 +82,7 @@ static struct fdleaks {
 #define STORE_COMMON(offset, name, ...)     \
        do { \
                struct fdleaks *tmp = &fdleaks[offset]; \
+               tmp->now = ast_tvnow(); \
                COPY(tmp->file, file);      \
                tmp->line = line;           \
                COPY(tmp->function, func);  \
@@ -271,7 +275,7 @@ static char *handle_show_fd(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
        case CLI_GENERATE:
                return NULL;
        }
-       getrlimit(RLIMIT_FSIZE, &rl);
+       getrlimit(RLIMIT_NOFILE, &rl);
        if (rl.rlim_cur == RLIM_INFINITY || rl.rlim_max == RLIM_INFINITY) {
                ast_copy_string(line, "unlimited", sizeof(line));
        } else {
@@ -280,8 +284,13 @@ static char *handle_show_fd(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
        ast_cli(a->fd, "Current maxfiles: %s\n", line);
        for (i = 0; i < ARRAY_LEN(fdleaks); i++) {
                if (fdleaks[i].isopen) {
+                       struct ast_tm tm = {0};
+                       char datestring[256];
+
+                       ast_localtime(&fdleaks[i].now, &tm, NULL);
+                       ast_strftime(datestring, sizeof(datestring), "%F %T", &tm);
                        snprintf(line, sizeof(line), "%d", fdleaks[i].line);
-                       ast_cli(a->fd, "%5d %15s:%-7.7s (%-25s): %s(%s)\n", i, fdleaks[i].file, line, fdleaks[i].function, fdleaks[i].callname, fdleaks[i].callargs);
+                       ast_cli(a->fd, "%5d [%s] %22s:%-7.7s (%-25s): %s(%s)\n", i, datestring, fdleaks[i].file, line, fdleaks[i].function, fdleaks[i].callname, fdleaks[i].callargs);
                }
        }
        return CLI_SUCCESS;