Skip to content

Commit ae14185

Browse files
committed
Implement atomic operations on Solaris 10 using atomic.h provided functions.
1 parent 4f5a46d commit ae14185

File tree

6 files changed

+207
-0
lines changed

6 files changed

+207
-0
lines changed

configure

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8765,6 +8765,14 @@ if test "x$ac_cv_header_limits_h" = xyes; then :
87658765
fi
87668766

87678767

8768+
8769+
ac_fn_cxx_check_header_mongrel "$LINENO" "atomic.h" "ac_cv_header_atomic_h" "$ac_includes_default"
8770+
if test "x$ac_cv_header_atomic_h" = xyes; then :
8771+
$as_echo "#define LOG4CPLUS_HAVE_ATOMIC_H 1" >>confdefs.h
8772+
8773+
fi
8774+
8775+
87688776
if test "x$with_iconv" = "xyes"; then :
87698777

87708778
ac_fn_cxx_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default"
@@ -9631,6 +9639,96 @@ fi
96319639

96329640

96339641

9642+
9643+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic_inc_uint" >&5
9644+
$as_echo_n "checking for atomic_inc_uint... " >&6; }
9645+
if ${ac_cv_atomic_inc_uint+:} false; then :
9646+
$as_echo_n "(cached) " >&6
9647+
else
9648+
9649+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
9650+
/* end confdefs.h. */
9651+
9652+
#include <stdlib.h>
9653+
#include <atomic.h>
9654+
9655+
int
9656+
main ()
9657+
{
9658+
9659+
volatile unsigned int x = 1;
9660+
atomic_inc_uint (&x);
9661+
if (x != 2)
9662+
abort ();
9663+
9664+
;
9665+
return 0;
9666+
}
9667+
_ACEOF
9668+
if ac_fn_cxx_try_link "$LINENO"; then :
9669+
ac_cv_atomic_inc_uint=yes
9670+
else
9671+
ac_cv_atomic_inc_uint=no
9672+
fi
9673+
rm -f core conftest.err conftest.$ac_objext \
9674+
conftest$ac_exeext conftest.$ac_ext
9675+
9676+
fi
9677+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_atomic_inc_uint" >&5
9678+
$as_echo "$ac_cv_atomic_inc_uint" >&6; }
9679+
9680+
if test "x$ac_cv_atomic_inc_uint" = "xyes"; then :
9681+
$as_echo "#define HAVE_ATOMIC_INC_UINT 1" >>confdefs.h
9682+
9683+
fi
9684+
9685+
9686+
9687+
9688+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic_dec_uint_nv" >&5
9689+
$as_echo_n "checking for atomic_dec_uint_nv... " >&6; }
9690+
if ${ac_cv_atomic_dec_uint_nv+:} false; then :
9691+
$as_echo_n "(cached) " >&6
9692+
else
9693+
9694+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
9695+
/* end confdefs.h. */
9696+
9697+
#include <stdlib.h>
9698+
9699+
int
9700+
main ()
9701+
{
9702+
9703+
volatile unsigned int x = 2;
9704+
volatile unsigned int y = atomic_dec_uint_nv (&x);
9705+
membar_exit();
9706+
if (x != 1 || y != 1)
9707+
abort ();
9708+
9709+
;
9710+
return 0;
9711+
}
9712+
_ACEOF
9713+
if ac_fn_cxx_try_link "$LINENO"; then :
9714+
ac_cv_atomic_dec_uint_nv=yes
9715+
else
9716+
ac_cv_atomic_dec_uint_nv=no
9717+
fi
9718+
rm -f core conftest.err conftest.$ac_objext \
9719+
conftest$ac_exeext conftest.$ac_ext
9720+
9721+
fi
9722+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_atomic_dec_uint_nv" >&5
9723+
$as_echo "$ac_cv_atomic_dec_uint_nv" >&6; }
9724+
9725+
if test "x$ac_cv_atomic_dec_uint_nv" = "xyes"; then :
9726+
$as_echo "#define HAVE_ATOMIC_DEC_UINT_NV 1" >>confdefs.h
9727+
9728+
fi
9729+
9730+
9731+
96349732
if test "x$ac_cv___sync_add_and_fetch" = "xyes"; then :
96359733
$as_echo "#define LOG4CPLUS_HAVE___SYNC_ADD_AND_FETCH 1" >>confdefs.h
96369734

@@ -9661,6 +9759,18 @@ fi
96619759
fi
96629760

96639761

9762+
if test "x$ax_cv_atomic_inc_uint"; then :
9763+
$as_echo "#define LOG4CPLUS_HAVE_ATOMIC_INC_UINT 1" >>confdefs.h
9764+
9765+
fi
9766+
9767+
9768+
if test "x$ax_cv_atomic_dec_uint_nv"; then :
9769+
$as_echo "#define LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV 1" >>confdefs.h
9770+
9771+
fi
9772+
9773+
96649774

96659775

96669776

configure.ac

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ LOG4CPLUS_CHECK_HEADER([wchar.h], [LOG4CPLUS_HAVE_WCHAR_H])
340340
LOG4CPLUS_CHECK_HEADER([time.h], [LOG4CPLUS_HAVE_TIME_H])
341341
LOG4CPLUS_CHECK_HEADER([errno.h], [LOG4CPLUS_HAVE_ERRNO_H])
342342
LOG4CPLUS_CHECK_HEADER([limits.h], [LOG4CPLUS_HAVE_LIMITS_H])
343+
LOG4CPLUS_CHECK_HEADER([atomic.h], [LOG4CPLUS_HAVE_ATOMIC_H])
343344
AS_IF([test "x$with_iconv" = "xyes"],
344345
[LOG4CPLUS_CHECK_HEADER([iconv.h], [LOG4CPLUS_HAVE_ICONV_H])])
345346

@@ -406,6 +407,14 @@ dnl Multi threaded library.
406407
AS_IF([test "x$ac_cv___atomic_sub_fetch" = "xyes"],
407408
[AC_DEFINE([LOG4CPLUS_HAVE___ATOMIC_SUB_FETCH])])
408409
410+
AH_TEMPLATE([LOG4CPLUS_HAVE_ATOMIC_INC_UINT])
411+
AS_IF([test "x$ax_cv_atomic_inc_uint"],
412+
[AC_DEFINE([LOG4CPLUS_HAVE_ATOMIC_INC_UINT])])
413+
414+
AH_TEMPLATE([LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV])
415+
AS_IF([test "x$ax_cv_atomic_dec_uint_nv"],
416+
[AC_DEFINE([LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV])])
417+
409418
AX_TLS_SUPPORT
410419
AH_TEMPLATE([LOG4CPLUS_HAVE_TLS_SUPPORT])
411420
AH_TEMPLATE([LOG4CPLUS_THREAD_LOCAL_VAR])

include/log4cplus/config.h.in

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
/* Defined if the compiler supports GNU style variadic macros. */
1212
#undef HAS_GNU_VARIADIC_MACROS
1313

14+
/* Defined if the compiler provides atomic_dec_uint_nv(). */
15+
#undef HAVE_ATOMIC_DEC_UINT_NV
16+
17+
/* Defined if the compiler provides atomic_inc_uint(). */
18+
#undef HAVE_ATOMIC_INC_UINT
19+
1420
/* Define to 1 if you have the `clock_gettime' function. */
1521
#undef HAVE_CLOCK_GETTIME
1622

@@ -217,6 +223,15 @@
217223
/* */
218224
#undef LOG4CPLUS_HAVE_ARPA_INET_H
219225

226+
/* */
227+
#undef LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV
228+
229+
/* */
230+
#undef LOG4CPLUS_HAVE_ATOMIC_H
231+
232+
/* */
233+
#undef LOG4CPLUS_HAVE_ATOMIC_INC_UINT
234+
220235
/* */
221236
#undef LOG4CPLUS_HAVE_C99_VARIADIC_MACROS
222237

include/log4cplus/config/defines.hxx.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@
177177
/* Defined if the compiler provides __atomic_sub_fetch(). */
178178
#undef LOG4CPLUS_HAVE___ATOMIC_SUB_FETCH
179179

180+
/* Defined if atomic_inc_uint() is available. */
181+
#undef LOG4CPLUS_HAVE_ATOMIC_INC_UINT
182+
183+
/* Defined if atomic_dec_uint_nv() is available. */
184+
#undef LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV
185+
180186
/* Defined if the compiler provides C++11 <atomic> header and increment,
181187
decrement operations. */
182188
#undef LOG4CPLUS_HAVE_CXX11_ATOMICS

m4/ax__sync.m4

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,60 @@ if (x != 1 || y != 1)
147147
AS_IF([test "x$ac_cv___atomic_sub_fetch" = "xyes"],
148148
[AC_DEFINE([HAVE___ATOMIC_SUB_FETCH], [1])])
149149
150+
dnl
151+
dnl Check for Solaris 10 atomic.h provided functions.
152+
dnl
153+
154+
AH_TEMPLATE([HAVE_ATOMIC_INC_UINT],
155+
[Defined if the compiler provides atomic_inc_uint().])
156+
157+
AC_CACHE_CHECK([for atomic_inc_uint], [ac_cv_atomic_inc_uint],
158+
[
159+
AC_LINK_IFELSE(
160+
[AC_LANG_PROGRAM(
161+
[[
162+
#include <stdlib.h>
163+
#include <atomic.h>
164+
]],
165+
[[
166+
volatile unsigned int x = 1;
167+
atomic_inc_uint (&x);
168+
if (x != 2)
169+
abort ();
170+
]])],
171+
[ac_cv_atomic_inc_uint=yes],
172+
[ac_cv_atomic_inc_uint=no])
173+
])
174+
175+
AS_IF([test "x$ac_cv_atomic_inc_uint" = "xyes"],
176+
[AC_DEFINE([HAVE_ATOMIC_INC_UINT], [1])])
177+
178+
dnl
179+
dnl Check for atomic_dec_uint_nv().
180+
dnl
181+
182+
AH_TEMPLATE([HAVE_ATOMIC_DEC_UINT_NV],
183+
[Defined if the compiler provides atomic_dec_uint_nv().])
184+
185+
AC_CACHE_CHECK([for atomic_dec_uint_nv], [ac_cv_atomic_dec_uint_nv],
186+
[
187+
AC_LINK_IFELSE(
188+
[AC_LANG_PROGRAM(
189+
[[
190+
#include <stdlib.h>
191+
]],
192+
[[
193+
volatile unsigned int x = 2;
194+
volatile unsigned int y = atomic_dec_uint_nv (&x);
195+
membar_exit();
196+
if (x != 1 || y != 1)
197+
abort ();
198+
]])],
199+
[ac_cv_atomic_dec_uint_nv=yes],
200+
[ac_cv_atomic_dec_uint_nv=no])
201+
])
202+
203+
AS_IF([test "x$ac_cv_atomic_dec_uint_nv" = "xyes"],
204+
[AC_DEFINE([HAVE_ATOMIC_DEC_UINT_NV], [1])])
205+
150206
])

src/pointer.cxx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
#if defined (LOG4CPLUS_HAVE_INTRIN_H)
2828
#include <intrin.h>
2929
#endif
30+
#if defined (LOG4CPLUS_HAVE_ATOMIC_H)
31+
#include <atomic.h>
32+
#endif
3033

3134

3235
namespace log4cplus { namespace helpers {
@@ -63,6 +66,9 @@ SharedObject::addReference() const
6366
#elif defined (LOG4CPLUS_HAVE___SYNC_ADD_AND_FETCH)
6467
__sync_add_and_fetch (&count, 1);
6568

69+
#elif defined (LOG4CPLUS_HAVE_ATOMIC_INC_UINT)
70+
atomic_inc_uint (&count);
71+
6672
#elif defined (_WIN32) && defined (LOG4CPLUS_HAVE_INTRIN_H)
6773
_InterlockedIncrement (&count);
6874

@@ -101,6 +107,11 @@ SharedObject::removeReference() const
101107
#elif defined (LOG4CPLUS_HAVE___SYNC_SUB_AND_FETCH)
102108
destroy = __sync_sub_and_fetch (&count, 1) == 0;
103109

110+
#elif defined (LOG4CPLUS_HAVE_ATOMIC_DEC_UINT_NV)
111+
destroy = atomic_dec_uint_nv (&count) == 0;
112+
if (destroy)
113+
membar_exit ();
114+
104115
#elif defined (_WIN32) && defined (LOG4CPLUS_HAVE_INTRIN_H)
105116
destroy = _InterlockedDecrement (&count) == 0;
106117

0 commit comments

Comments
 (0)