DISPATCH-390: refactor - log->ref_count use atomic counter
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/56e2845a Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/56e2845a Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/56e2845a Branch: refs/heads/master Commit: 56e2845a75b08d5574238e15526381fe4cbaa37c Parents: 336c536 Author: Alan Conway <[email protected]> Authored: Mon Mar 27 10:08:44 2017 -0400 Committer: Alan Conway <[email protected]> Committed: Tue Apr 25 18:13:59 2017 -0400 ---------------------------------------------------------------------- include/qpid/dispatch/atomic.h | 7 +++++-- src/log.c | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56e2845a/include/qpid/dispatch/atomic.h ---------------------------------------------------------------------- diff --git a/include/qpid/dispatch/atomic.h b/include/qpid/dispatch/atomic.h index d72bad2..08d63f1 100644 --- a/include/qpid/dispatch/atomic.h +++ b/include/qpid/dispatch/atomic.h @@ -175,7 +175,10 @@ static inline void sys_atomic_destroy(sys_atomic_t *ref) #endif -#define sys_atomic_inc(ref) sys_atomic_add((ref), 1) -#define sys_atomic_dec(ref) sys_atomic_sub((ref), 1) +/** Atomic increase: NOTE returns value *before* increase, like i++ */ +static inline uint32_t sys_atomic_inc(sys_atomic_t *ref) { return sys_atomic_add((ref), 1); } + +/** Atomic decrease: NOTE returns value *before* decrease, like i-- */ +static inline uint32_t sys_atomic_dec(sys_atomic_t *ref) { return sys_atomic_sub((ref), 1); } #endif http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/56e2845a/src/log.c ---------------------------------------------------------------------- diff --git a/src/log.c b/src/log.c index 896d314..b11fd50 100644 --- a/src/log.c +++ b/src/log.c @@ -23,6 +23,7 @@ #include "entity.h" #include "entity_cache.h" #include "aprintf.h" +#include <qpid/dispatch/atomic.h> #include <qpid/dispatch/ctools.h> #include <qpid/dispatch/dispatch.h> #include "alloc.h" @@ -70,7 +71,7 @@ static void qd_log_entry_free_lh(qd_log_entry_t* entry) { // Ref-counted log sink, may be shared by several sources. typedef struct log_sink_t { - int refcount; + sys_atomic_t ref_count; char *name; bool syslog; FILE *file; @@ -97,9 +98,9 @@ static log_sink_t* find_log_sink_lh(const char* name) { // Must hold the log_source_lock static void log_sink_free_lh(log_sink_t* sink) { if (!sink) return; - assert(sink->refcount); + assert(sink->ref_count); - if (--sink->refcount == 0) { + if (sys_atomic_dec(&sink->ref_count) == 1) { DEQ_REMOVE(sink_list, sink); free(sink->name); if (sink->file && sink->file != stderr) @@ -113,7 +114,7 @@ static void log_sink_free_lh(log_sink_t* sink) { static log_sink_t* log_sink_lh(const char* name) { log_sink_t* sink = find_log_sink_lh(name); if (sink) - sink->refcount++; + sys_atomic_inc(&sink->ref_count); else { bool syslog = false; @@ -373,7 +374,7 @@ qd_log_source_t *qd_log_source_reset(const char *module) } static void qd_log_source_free_lh(qd_log_source_t* src) { - DEQ_REMOVE_HEAD(source_list); + DEQ_REMOVE(source_list, src); log_sink_free_lh(src->sink); free(src->module); free(src); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
