summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2013-12-13 14:05:01 +0100
committerBen Pfaff <blp@nicira.com>2013-12-13 09:15:01 -0800
commit86e504e102aa69c379cd465966daf197152618e6 (patch)
tree199fd8925d8943f6105f2a881fb3c0a3fce977b8
parent6164839f3ee00436b32af3100c903ee152803117 (diff)
downloadopenvswitch-86e504e102aa69c379cd465966daf197152618e6.tar.gz
vlog: Use OVS_CONSTRUCTOR for vlog initialization
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@googlemail.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
-rw-r--r--lib/vlog.c63
-rw-r--r--lib/vlog.h16
2 files changed, 32 insertions, 47 deletions
diff --git a/lib/vlog.c b/lib/vlog.c
index 0fa1ab29c..540e72ac2 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 da55405b3..226b7f827 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 */ \