ldap/servers/slapd/slapi_counter.c | 75 -------------------------------------
1 file changed, 75 deletions(-)
New commits:
commit c5bd90755da96f463ba5dfda79793d5d6cee4e53
Author: Nathan Kinder <nkinder(a)redhat.com>
Date: Mon Jul 25 14:07:41 2011 -0700
Bug 723937 - Slapi_Counter API broken on 32-bit F15
We use some embedded assembly code to implement atomic 64-bit
counter operations on 32-bit platforms. On F15, gcc optimizes
this assembly code, breaking our counter get/set functions. It
turns out that we can just use the gcc built-in atomic operation
functions now (this wasn't the case in the past).
This patch removes our get/set assembly code and just uses the
gcc built-in functions instead.
diff --git a/ldap/servers/slapd/slapi_counter.c b/ldap/servers/slapd/slapi_counter.c
index c3f1f44..a4476e5 100644
--- a/ldap/servers/slapd/slapi_counter.c
+++ b/ldap/servers/slapd/slapi_counter.c
@@ -292,49 +292,12 @@ PRUint64 slapi_counter_set_value(Slapi_Counter *counter, PRUint64
newvalue)
return newvalue;
#else
#ifdef LINUX
-/* Use our own inline assembly for an atomic set if
- * the builtins aren't available. */
-#if defined CPU_x86 || !HAVE_DECL___SYNC_ADD_AND_FETCH
- /*
- * %0 = counter->value
- * %1 = newvalue
- */
- __asm__ __volatile__(
-#ifdef CPU_x86
- /* Save the PIC register */
- " pushl %%ebx;"
-#endif /* CPU_x86 */
- /* Put value of counter->value in EDX:EAX */
- "retryset: movl %0, %%eax;"
- " movl 4%0, %%edx;"
- /* Put newval in ECX:EBX */
- " movl %1, %%ebx;"
- " movl 4+%1, %%ecx;"
- /* If EDX:EAX and counter-> are the same,
- * replace *ptr with ECX:EBX */
- " lock; cmpxchg8b %0;"
- " jnz retryset;"
-#ifdef CPU_x86
- /* Restore the PIC register */
- " popl %%ebx"
-#endif /* CPU_x86 */
- : "+o" (counter->value)
- : "m" (newvalue)
-#ifdef CPU_x86
- : "memory", "eax", "ecx", "edx",
"cc");
-#else
- : "memory", "eax", "ebx", "ecx",
"edx", "cc");
-#endif
-
- return newvalue;
-#else
while (1) {
value = counter->value;
if (__sync_bool_compare_and_swap(&(counter->value), value, newvalue)) {
return newvalue;
}
}
-#endif /* CPU_x86 || !HAVE_DECL___SYNC_ADD_AND_FETCH */
#elif defined(SOLARIS)
_sparcv9_AtomicSet(&(counter->value), newvalue);
return newvalue;
@@ -368,50 +331,12 @@ PRUint64 slapi_counter_get_value(Slapi_Counter *counter)
slapi_unlock_mutex(counter->lock);
#else
#ifdef LINUX
-/* Use our own inline assembly for an atomic get if
- * the builtins aren't available. */
-#if defined CPU_x86 || !HAVE_DECL___SYNC_ADD_AND_FETCH
- /*
- * %0 = counter->value
- * %1 = value
- */
- __asm__ __volatile__(
-#ifdef CPU_x86
- /* Save the PIC register */
- " pushl %%ebx;"
-#endif /* CPU_x86 */
- /* Put value of counter->value in EDX:EAX */
- "retryget: movl %0, %%eax;"
- " movl 4%0, %%edx;"
- /* Copy EDX:EAX to ECX:EBX */
- " movl %%eax, %%ebx;"
- " movl %%edx, %%ecx;"
- /* If EDX:EAX and counter->value are the same,
- * replace *ptr with ECX:EBX */
- " lock; cmpxchg8b %0;"
- " jnz retryget;"
- /* Put retreived value into value */
- " movl %%ebx, %1;"
- " movl %%ecx, 4%1;"
-#ifdef CPU_x86
- /* Restore the PIC register */
- " popl %%ebx"
-#endif /* CPU_x86 */
- : "+o" (counter->value), "=m" (value)
- :
-#ifdef CPU_x86
- : "memory", "eax", "ecx", "edx",
"cc");
-#else
- : "memory", "eax", "ebx", "ecx",
"edx", "cc");
-#endif
-#else
while (1) {
value = counter->value;
if (__sync_bool_compare_and_swap(&(counter->value), value, value)) {
break;
}
}
-#endif /* CPU_x86 || !HAVE_DECL___SYNC_ADD_AND_FETCH */
#elif defined(SOLARIS)
while (1) {
value = counter->value;
Show replies by date