From: Ben Pfaff Date: Fri, 12 Jul 2013 21:18:01 +0000 (-0700) Subject: util: Make subprogram_name thread-specific. X-Git-Tag: sliver-openvswitch-2.0.90-1~36^2~38 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=bc9fb3a9cd588148e97eaae4eaa200faf0ac8d33;p=sliver-openvswitch.git util: Make subprogram_name thread-specific. Signed-off-by: Ben Pfaff --- diff --git a/lib/daemon.c b/lib/daemon.c index 3c1e5c3b7..2c8cf32af 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -400,7 +400,7 @@ monitor_daemon(pid_t daemon_pid) char *status_msg; int crashes; - subprogram_name = "monitor"; + set_subprogram_name("monitor"); status_msg = xstrdup("healthy"); last_restart = TIME_MIN; crashes = 0; @@ -470,7 +470,7 @@ monitor_daemon(pid_t daemon_pid) /* Running in new daemon process. */ proctitle_restore(); - subprogram_name = ""; + set_subprogram_name(""); } /* Close standard file descriptors (except any that the client has requested we diff --git a/lib/util.c b/lib/util.c index 0ba1ed559..c69d7d150 100644 --- a/lib/util.c +++ b/lib/util.c @@ -38,9 +38,9 @@ COVERAGE_DEFINE(util_xalloc); /* argv[0] without directory names. */ const char *program_name; -/* Ordinarily "" but set to "monitor" for a monitor process or "worker" for a - * worker process. */ -const char *subprogram_name = ""; +/* Name for the currently running thread or process, for log messages, process + * listings, and debuggers. */ +DEFINE_PER_THREAD_MALLOCED_DATA(char *, subprogram_name); /* --version option output. */ static char *program_version; @@ -281,6 +281,7 @@ ovs_error(int err_no, const char *format, ...) void ovs_error_valist(int err_no, const char *format, va_list args) { + const char *subprogram_name = get_subprogram_name(); int save_errno = errno; if (subprogram_name[0]) { @@ -385,6 +386,22 @@ set_program_name__(const char *argv0, const char *version, const char *date, } } +/* Returns the name of the currently running thread or process. */ +const char * +get_subprogram_name(void) +{ + const char *name = subprogram_name_get(); + return name ? name : ""; +} + +/* Sets 'name' as the name of the currently running thread or process. (This + * appears in log messages.) */ +void +set_subprogram_name(const char *name) +{ + free(subprogram_name_set(xstrdup(name))); +} + /* Returns a pointer to a string describing the program version. The * caller must not modify or free the returned string. */ diff --git a/lib/util.h b/lib/util.h index c71f027c5..ae8bfd7a2 100644 --- a/lib/util.h +++ b/lib/util.h @@ -86,7 +86,6 @@ void ovs_assert_failure(const char *, const char *, const char *) NO_RETURN; (TYPE) (POINTER)) extern const char *program_name; -extern const char *subprogram_name; /* Returns the number of elements in ARRAY. */ #define ARRAY_SIZE(ARRAY) (sizeof ARRAY / sizeof *ARRAY) @@ -184,6 +183,9 @@ void set_program_name__(const char *name, const char *version, #define set_program_name(name) \ set_program_name__(name, VERSION, __DATE__, __TIME__) +const char *get_subprogram_name(void); +void set_subprogram_name(const char *name); + const char *get_program_version(void); void ovs_print_version(uint8_t min_ofp, uint8_t max_ofp); diff --git a/lib/vlog.c b/lib/vlog.c index a880e0796..bbc7c55de 100644 --- a/lib/vlog.c +++ b/lib/vlog.c @@ -665,6 +665,7 @@ format_log_message(const struct vlog_module *module, enum vlog_level level, ds_clear(s); for (p = facilities[facility].pattern; *p != '\0'; ) { + const char *subprogram_name; enum { LEFT, RIGHT } justify = RIGHT; int pad = '0'; size_t length, field, used; @@ -732,9 +733,11 @@ format_log_message(const struct vlog_module *module, enum vlog_level level, ds_put_format(s, "%lld", time_msec() - time_boot_msec()); break; case 't': + subprogram_name = get_subprogram_name(); ds_put_cstr(s, subprogram_name[0] ? subprogram_name : "main"); break; case 'T': + subprogram_name = get_subprogram_name(); if (subprogram_name[0]) { ds_put_format(s, "(%s)", subprogram_name); } diff --git a/lib/worker.c b/lib/worker.c index 6904fdd1d..1a90257a5 100644 --- a/lib/worker.c +++ b/lib/worker.c @@ -362,7 +362,7 @@ worker_main(int fd) server_sock = fd; - subprogram_name = "worker"; + set_subprogram_name("worker"); proctitle_set("worker process for pid %lu", (unsigned long int) getppid()); VLOG_INFO("worker process started");