diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2010-04-27 17:31:28 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2010-04-27 17:31:28 +0200 |
commit | cbe2e3d44496ec7c6418e7e74ce917f2086a2947 (patch) | |
tree | c8a38b598ad1ea3bdb375674f27386d5fbc361e8 /runtime/prop.c | |
parent | d19806431653e6575a002ab48206c16d3041e465 (diff) | |
download | rsyslog-cbe2e3d44496ec7c6418e7e74ce917f2086a2947.tar.gz rsyslog-cbe2e3d44496ec7c6418e7e74ce917f2086a2947.tar.xz rsyslog-cbe2e3d44496ec7c6418e7e74ce917f2086a2947.zip |
bugfix: problems with atomic operations emulation
replaced atomic operation emulation with new code. The previous code
seemed to have some issue and also limited concurrency severely. The
whole atomic operation emulation has been rewritten.
Diffstat (limited to 'runtime/prop.c')
-rw-r--r-- | runtime/prop.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/runtime/prop.c b/runtime/prop.c index d188b2ed..7f2a56ff 100644 --- a/runtime/prop.c +++ b/runtime/prop.c @@ -53,6 +53,7 @@ DEFobjStaticHelpers */ BEGINobjConstruct(prop) /* be sure to specify the object type also in END macro! */ pThis->iRefCount = 1; + INIT_ATOMIC_HELPER_MUT(pThis->mutRefCount); ENDobjConstruct(prop) @@ -60,11 +61,12 @@ ENDobjConstruct(prop) BEGINobjDestruct(prop) /* be sure to specify the object type also in END and CODESTART macros! */ int currRefCount; CODESTARTobjDestruct(prop) - currRefCount = ATOMIC_DEC_AND_FETCH(pThis->iRefCount); + currRefCount = ATOMIC_DEC_AND_FETCH(&pThis->iRefCount, &pThis->mutRefCount); if(currRefCount == 0) { /* (only) in this case we need to actually destruct the object */ if(pThis->len >= CONF_PROP_BUFSIZE) free(pThis->szVal.psz); + DESTROY_ATOMIC_HELPER_MUT(pThis->mutRefCount); } else { pThis = NULL; /* tell framework NOT to destructing the object! */ } @@ -132,7 +134,7 @@ propConstructFinalize(prop_t __attribute__((unused)) *pThis) */ static rsRetVal AddRef(prop_t *pThis) { - ATOMIC_INC(pThis->iRefCount); + ATOMIC_INC(&pThis->iRefCount, &pThis->mutRefCount); return RS_RET_OK; } |