X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fvlog.h;h=d7d63bf11abe241de290aff91439c8e273bc75e1;hb=0e19706066f34523854cbce50c05c367e700c451;hp=9570b0ef332730002031cd1a5a64ea7f1fa54bc5;hpb=d41d4b714d29091dd502dd8705ef489467e11a43;p=sliver-openvswitch.git diff --git a/lib/vlog.h b/lib/vlog.h index 9570b0ef3..d7d63bf11 100644 --- a/lib/vlog.h +++ b/lib/vlog.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,11 +17,21 @@ #ifndef VLOG_H #define VLOG_H 1 +/* Logging. + * + * + * Thread-safety + * ============= + * + * Fully thread safe. + */ + #include #include #include #include #include "compiler.h" +#include "ovs-thread.h" #include "sat-math.h" #include "token-bucket.h" #include "util.h" @@ -52,9 +62,9 @@ enum vlog_level vlog_get_level_val(const char *name); /* Facilities that we can log to. */ #define VLOG_FACILITIES \ - VLOG_FACILITY(SYSLOG, "%05N|%c%T|%p|%m") \ + VLOG_FACILITY(SYSLOG, "ovs|%05N|%c%T|%p|%m") \ VLOG_FACILITY(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") \ - VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") + VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m") enum vlog_facility { #define VLOG_FACILITY(NAME, PATTERN) VLF_##NAME, VLOG_FACILITIES @@ -71,14 +81,15 @@ struct vlog_module { 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. */ }; /* 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 *vlog_module_ptr_##MODULE; \ - struct vlog_module *vlog_module_ptr_##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 @@ -93,6 +104,7 @@ struct vlog_rate_limit { time_t first_dropped; /* Time first message was dropped. */ time_t last_dropped; /* Time of most recent message drop. */ unsigned int n_dropped; /* Number of messages dropped. */ + struct ovs_mutex mutex; /* Mutual exclusion for rate limit. */ }; /* Number of tokens to emit a message. We add 'rate' tokens per millisecond, @@ -107,13 +119,15 @@ struct vlog_rate_limit { 0, /* first_dropped */ \ 0, /* last_dropped */ \ 0, /* n_dropped */ \ + OVS_MUTEX_INITIALIZER /* mutex */ \ } /* Configuring how each module logs messages. */ enum vlog_level vlog_get_level(const struct vlog_module *, enum vlog_facility); void vlog_set_levels(struct vlog_module *, enum vlog_facility, enum vlog_level); -char *vlog_set_levels_from_string(const char *); +char *vlog_set_levels_from_string(const char *) WARN_UNUSED_RESULT; +void vlog_set_levels_from_string_assert(const char *); char *vlog_get_levels(void); bool vlog_is_enabled(const struct vlog_module *, enum vlog_level); bool vlog_should_drop(const struct vlog_module *, enum vlog_level, @@ -122,13 +136,12 @@ void vlog_set_verbosity(const char *arg); /* Configuring log facilities. */ void vlog_set_pattern(enum vlog_facility, const char *pattern); -const char *vlog_get_log_file(void); int vlog_set_log_file(const char *file_name); int vlog_reopen_log_file(void); /* Initialization. */ void vlog_init(void); -void vlog_exit(void); +void vlog_enable_async(void); /* Functions for actual logging. */ void vlog(const struct vlog_module *, enum vlog_level, const char *format, ...) @@ -228,22 +241,23 @@ void vlog_usage(void); vlog_rate_limit(THIS_MODULE, level__, RL, __VA_ARGS__); \ } \ } while (0) -#define VLOG_ONCE(LEVEL, ...) \ - do { \ - static bool already_logged; \ - if (!already_logged) { \ - already_logged = true; \ - vlog(THIS_MODULE, LEVEL, __VA_ARGS__); \ - } \ +#define VLOG_ONCE(LEVEL, ...) \ + do { \ + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; \ + if (ovsthread_once_start(&once)) { \ + vlog(THIS_MODULE, LEVEL, __VA_ARGS__); \ + ovsthread_once_done(&once); \ + } \ } while (0) #define VLOG_DEFINE_MODULE__(MODULE) \ extern struct vlog_module VLM_##MODULE; \ struct vlog_module VLM_##MODULE = \ { \ - #MODULE, /* name */ \ + #MODULE, /* name */ \ { [ 0 ... VLF_N_FACILITIES - 1] = VLL_INFO }, /* levels */ \ - VLL_INFO, /* min_level */ \ + VLL_INFO, /* min_level */ \ + true /* honor_rate_limits */ \ }; #ifdef __cplusplus