You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/04/25 22:25:04 UTC

[6/6] qpid-dispatch git commit: DISPATCH-390: refactor - log->ref_count use atomic counter

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 <ac...@redhat.com>
Authored: Mon Mar 27 10:08:44 2017 -0400
Committer: Alan Conway <ac...@redhat.com>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org