summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2011-11-15 20:33:26 (GMT)
committerFelipe Pena <felipe@php.net>2011-11-15 20:33:26 (GMT)
commit42776c0259b94d63e82f869442e8ee7f27a33387 (patch)
tree37738d49353661737573f807be0b86be39192916
parentb6530d8978aab57eebd17f6076035f786ae1693b (diff)
downloadphp-42776c0259b94d63e82f869442e8ee7f27a33387.tar.gz
- Fixed bug #55874 (GCC does not provide __sync_fetch_and_add on some archs)
patch by: klightspeed at netspace dot net dot au
-rw-r--r--NEWS2
-rw-r--r--configure.in7
-rw-r--r--ext/standard/php_crypt_r.c3
3 files changed, 10 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 350ede9..63714b5 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PHP NEWS
?? ??? 2011, PHP 5.3.9
- Core:
+ . Fixed bug #55874 (GCC does not provide __sync_fetch_and_add on some archs).
+ (klightspeed at netspace dot net dot au)
. Fixed bug #52624 (tempnam() by-pass open_basedir with inexistent directory).
(Felipe)
diff --git a/configure.in b/configure.in
index a63afa7..3ab1e46 100644
--- a/configure.in
+++ b/configure.in
@@ -661,6 +661,13 @@ if test "$ac_cv_func_getaddrinfo" = yes; then
AC_DEFINE(HAVE_GETADDRINFO,1,[Define if you have the getaddrinfo function])
fi
+dnl Check for the __sync_fetch_and_add builtin
+AC_CACHE_CHECK([for __sync_fetch_and_add], ac_cv_func_sync_fetch_and_add,
+[AC_TRY_LINK([],[int x;__sync_fetch_and_add(&x,1);],ac_cv_func_sync_fetch_and_add=yes,ac_cv_func_sync_fetch_and_add=no)])
+if test "$ac_cv_func_sync_fetch_and_add" = yes; then
+ AC_DEFINE(HAVE_SYNC_FETCH_AND_ADD,1,[Define if you have the __sync_fetch_and_add function])
+fi
+
AC_REPLACE_FUNCS(strlcat strlcpy getopt)
AC_FUNC_UTIME_NULL
AC_FUNC_ALLOCA
diff --git a/ext/standard/php_crypt_r.c b/ext/standard/php_crypt_r.c
index 042bcb9..13db65e 100644
--- a/ext/standard/php_crypt_r.c
+++ b/ext/standard/php_crypt_r.c
@@ -94,8 +94,7 @@ void _crypt_extended_init_r(void)
if (!initialized) {
#ifdef PHP_WIN32
InterlockedIncrement(&initialized);
-#elif (defined(__GNUC__) && !defined(__hpux) && !defined(__hppa__) && (__GNUC__ > 4 || \
- (__GNUC__ == 4 && (__GNUC_MINOR__ > 1 || (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ > 1)))))
+#elif defined(HAVE_SYNC_FETCH_AND_ADD)
__sync_fetch_and_add(&initialized, 1);
#elif defined(HAVE_ATOMIC_H) /* Solaris 10 defines atomic API within */
membar_producer();