[ovs-dev] [PATCH 2/6] vlog: Use OVS_CONSTRUCTOR for vlog initialization

Helmut Schaa helmut.schaa at googlemail.com
Fri Dec 13 13:05:01 UTC 2013


This allows to get rid of some special segment handling to allow
distributed registering of vlog modules.

Instead use a global list and vlog module constructor functions to
build up the list. That means vlog modules reside within the
compilation unit they are defined in and can be iterated upon
by using the global list vlog_modules.

Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>
---
 lib/vlog.c | 63 +++++++++++++++++++++++---------------------------------------
 lib/vlog.h | 16 +++++++++-------
 2 files changed, 32 insertions(+), 47 deletions(-)

diff --git a/lib/vlog.c b/lib/vlog.c
index 0fa1ab2..540e72a 100644
--- a/lib/vlog.c
+++ b/lib/vlog.c
@@ -75,24 +75,7 @@ VLOG_LEVELS
 BUILD_ASSERT_DECL(LOG_LOCAL0 == (16 << 3));
 
 /* The log modules. */
-#if USE_LINKER_SECTIONS
-extern struct vlog_module *__start_vlog_modules[];
-extern struct vlog_module *__stop_vlog_modules[];
-#define vlog_modules __start_vlog_modules
-#define n_vlog_modules (__stop_vlog_modules - __start_vlog_modules)
-#else
-#define VLOG_MODULE VLOG_DEFINE_MODULE__
-#include "vlog-modules.def"
-#undef VLOG_MODULE
-
-extern struct vlog_module *vlog_modules[];
-struct vlog_module *vlog_modules[] = {
-#define VLOG_MODULE(NAME) &VLM_##NAME,
-#include "vlog-modules.def"
-#undef VLOG_MODULE
-};
-#define n_vlog_modules ARRAY_SIZE(vlog_modules)
-#endif
+struct list vlog_modules = LIST_INITIALIZER(&vlog_modules);
 
 /* Protects the 'pattern' in all "struct facility"s, so that a race between
  * changing and reading the pattern does not cause an access to freed
@@ -199,13 +182,14 @@ vlog_get_module_name(const struct vlog_module *module)
 struct vlog_module *
 vlog_module_from_name(const char *name)
 {
-    struct vlog_module **mp;
+    struct vlog_module *mp;
 
-    for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
-        if (!strcasecmp(name, (*mp)->name)) {
-            return *mp;
+    LIST_FOR_EACH (mp, list, &vlog_modules) {
+        if (!strcasecmp(name, mp->name)) {
+            return mp;
         }
     }
+
     return NULL;
 }
 
@@ -242,11 +226,10 @@ set_facility_level(enum vlog_facility facility, struct vlog_module *module,
 
     ovs_mutex_lock(&log_file_mutex);
     if (!module) {
-        struct vlog_module **mp;
-
-        for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
-            (*mp)->levels[facility] = level;
-            update_min_level(*mp);
+        struct vlog_module *mp;
+        LIST_FOR_EACH (mp, list, &vlog_modules) {
+            mp->levels[facility] = level;
+            update_min_level(mp);
         }
     } else {
         module->levels[facility] = level;
@@ -308,7 +291,7 @@ int
 vlog_set_log_file(const char *file_name)
 {
     char *new_log_file_name;
-    struct vlog_module **mp;
+    struct vlog_module *mp;
     struct stat old_stat;
     struct stat new_stat;
     int new_log_fd;
@@ -364,8 +347,8 @@ vlog_set_log_file(const char *file_name)
         log_writer = async_append_create(new_log_fd);
     }
 
-    for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
-        update_min_level(*mp);
+    LIST_FOR_EACH (mp, list, &vlog_modules) {
+        update_min_level(mp);
     }
     ovs_mutex_unlock(&log_file_mutex);
 
@@ -563,10 +546,10 @@ vlog_unixctl_reopen(struct unixctl_conn *conn, int argc OVS_UNUSED,
 static void
 set_all_rate_limits(bool enable)
 {
-    struct vlog_module **mp;
+    struct vlog_module *mp;
 
-    for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
-        (*mp)->honor_rate_limits = enable;
+    LIST_FOR_EACH (mp, list, &vlog_modules) {
+        mp->honor_rate_limits = enable;
     }
 }
 
@@ -672,7 +655,7 @@ char *
 vlog_get_levels(void)
 {
     struct ds s = DS_EMPTY_INITIALIZER;
-    struct vlog_module **mp;
+    struct vlog_module *mp;
     struct svec lines = SVEC_EMPTY_INITIALIZER;
     char *line;
     size_t i;
@@ -680,16 +663,16 @@ vlog_get_levels(void)
     ds_put_format(&s, "                 console    syslog    file\n");
     ds_put_format(&s, "                 -------    ------    ------\n");
 
-    for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
+    LIST_FOR_EACH (mp, list, &vlog_modules) {
         struct ds line;
 
         ds_init(&line);
         ds_put_format(&line, "%-16s  %4s       %4s       %4s",
-                      vlog_get_module_name(*mp),
-                      vlog_get_level_name(vlog_get_level(*mp, VLF_CONSOLE)),
-                      vlog_get_level_name(vlog_get_level(*mp, VLF_SYSLOG)),
-                      vlog_get_level_name(vlog_get_level(*mp, VLF_FILE)));
-        if (!(*mp)->honor_rate_limits) {
+                      vlog_get_module_name(mp),
+                      vlog_get_level_name(vlog_get_level(mp, VLF_CONSOLE)),
+                      vlog_get_level_name(vlog_get_level(mp, VLF_SYSLOG)),
+                      vlog_get_level_name(vlog_get_level(mp, VLF_FILE)));
+        if (!mp->honor_rate_limits) {
             ds_put_cstr(&line, "    (rate limiting disabled)");
         }
         ds_put_char(&line, '\n');
diff --git a/lib/vlog.h b/lib/vlog.h
index da55405..226b7f8 100644
--- a/lib/vlog.h
+++ b/lib/vlog.h
@@ -35,6 +35,7 @@
 #include "sat-math.h"
 #include "token-bucket.h"
 #include "util.h"
+#include "list.h"
 
 #ifdef  __cplusplus
 extern "C" {
@@ -78,22 +79,22 @@ enum vlog_facility vlog_get_facility_val(const char *name);
 
 /* A log module. */
 struct vlog_module {
+    struct list list;
     const char *name;             /* User-visible name. */
     int levels[VLF_N_FACILITIES]; /* Minimum log level for each facility. */
     int min_level;                /* Minimum log level for any facility. */
     bool honor_rate_limits;       /* Set false to ignore rate limits. */
 };
 
+/* Global list of all logging modules */
+extern struct list vlog_modules;
+
 /* Creates and initializes a global instance of a module named MODULE. */
-#if USE_LINKER_SECTIONS
 #define VLOG_DEFINE_MODULE(MODULE)                                      \
         VLOG_DEFINE_MODULE__(MODULE)                                    \
-        extern struct vlog_module *const vlog_module_ptr_##MODULE;      \
-        struct vlog_module *const vlog_module_ptr_##MODULE              \
-            __attribute__((section("vlog_modules"))) = &VLM_##MODULE
-#else
-#define VLOG_DEFINE_MODULE(MODULE) extern struct vlog_module VLM_##MODULE
-#endif
+        OVS_CONSTRUCTOR(init_##MODULE) {                                \
+                list_insert(&vlog_modules, &VLM_##MODULE.list);         \
+        }                                                               \
 
 const char *vlog_get_module_name(const struct vlog_module *);
 struct vlog_module *vlog_module_from_name(const char *name);
@@ -266,6 +267,7 @@ void vlog_usage(void);
         extern struct vlog_module VLM_##MODULE;                         \
         struct vlog_module VLM_##MODULE =                               \
         {                                                               \
+            LIST_INITIALIZER(&VLM_##MODULE.list),                       \
             #MODULE,                                        /* name */  \
             { [ 0 ... VLF_N_FACILITIES - 1] = VLL_INFO }, /* levels */  \
             VLL_INFO,                                  /* min_level */  \
-- 
1.8.1.4




More information about the dev mailing list