[ovs-dev] [threads 23/28] util: Make subprogram_name thread-specific.

Ben Pfaff blp at nicira.com
Wed Jul 10 23:04:05 UTC 2013


Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 lib/daemon.c |    4 ++--
 lib/util.c   |   18 ++++++++++++++++--
 lib/util.h   |    4 +++-
 lib/vlog.c   |    3 +++
 4 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/lib/daemon.c b/lib/daemon.c
index edeeca2..98f30d7 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 8e628cc..bd88355 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -38,8 +38,8 @@ COVERAGE_DEFINE(util_xalloc);
 /* argv[0] without directory names. */
 const char *program_name;
 
-/* Ordinarily "" but set to "monitor" for a monitor process. */
-const char *subprogram_name = "";
+/* Name for the currently running thread or process. */
+DEFINE_PER_THREAD_MALLOCED_DATA(char *, subprogram_name);
 
 /* --version option output. */
 static char *program_version;
@@ -280,6 +280,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]) {
@@ -384,6 +385,19 @@ set_program_name__(const char *argv0, const char *version, const char *date,
     }
 }
 
+const char *
+get_subprogram_name(void)
+{
+    const char *name = subprogram_name_get();
+    return name ? name : "";
+}
+
+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 080fe05..2159594 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)
@@ -203,6 +202,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 db13c85..b07fd91 100644
--- a/lib/vlog.c
+++ b/lib/vlog.c
@@ -672,6 +672,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;
@@ -739,9 +740,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);
             }
-- 
1.7.2.5




More information about the dev mailing list