Colin Fowler : libport: Add generic interlocked instruction support fallback.

Alexandre Julliard julliard at winehq.org
Mon Sep 28 11:54:34 CDT 2009


Module: wine
Branch: master
Commit: c741ad7dde3210843bb0d9eb07145e5f705bf355
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c741ad7dde3210843bb0d9eb07145e5f705bf355

Author: Colin Fowler <elethiomel at gmail.com>
Date:   Fri Sep 25 16:53:17 2009 +0100

libport: Add generic interlocked instruction support fallback.

---

 libs/port/interlocked.c |  147 ++++++++++++++++++++++++-----------------------
 1 files changed, 75 insertions(+), 72 deletions(-)

diff --git a/libs/port/interlocked.c b/libs/port/interlocked.c
index 51794d3..b2d4b52 100644
--- a/libs/port/interlocked.c
+++ b/libs/port/interlocked.c
@@ -268,77 +268,6 @@ void* interlocked_xchg_ptr( void** dest, void* val )
     return ret;
 }
 
-#elif defined(__sparc__) && defined(__sun__)
-
-/*
- * As the earlier Sparc processors lack necessary atomic instructions,
- * I'm simply falling back to the library-provided _lwp_mutex routines
- * to ensure mutual exclusion in a way appropriate for the current
- * architecture.
- *
- * FIXME:  If we have the compare-and-swap instruction (Sparc v9 and above)
- *         we could use this to speed up the Interlocked operations ...
- */
-#include <synch.h>
-static lwp_mutex_t interlocked_mutex = DEFAULTMUTEX;
-
-int interlocked_cmpxchg( int *dest, int xchg, int compare )
-{
-    _lwp_mutex_lock( &interlocked_mutex );
-    if (*dest == compare) *dest = xchg;
-    else compare = *dest;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return compare;
-}
-
-void *interlocked_cmpxchg_ptr( void **dest, void *xchg, void *compare )
-{
-    _lwp_mutex_lock( &interlocked_mutex );
-    if (*dest == compare) *dest = xchg;
-    else compare = *dest;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return compare;
-}
-
-__int64 interlocked_cmpxchg64( __int64 *dest, __int64 xchg, __int64 compare )
-{
-    _lwp_mutex_lock( &interlocked_mutex );
-    if (*dest == compare) *dest = xchg;
-    else compare = *dest;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return compare;
-}
-
-int interlocked_xchg( int *dest, int val )
-{
-    int retv;
-    _lwp_mutex_lock( &interlocked_mutex );
-    retv = *dest;
-    *dest = val;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return retv;
-}
-
-void *interlocked_xchg_ptr( void **dest, void *val )
-{
-    void *retv;
-    _lwp_mutex_lock( &interlocked_mutex );
-    retv = *dest;
-    *dest = val;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return retv;
-}
-
-int interlocked_xchg_add( int *dest, int incr )
-{
-    int retv;
-    _lwp_mutex_lock( &interlocked_mutex );
-    retv = *dest;
-    *dest += incr;
-    _lwp_mutex_unlock( &interlocked_mutex );
-    return retv;
-}
-
 #elif defined(__ALPHA__) && defined(__GNUC__)
 
 __ASM_GLOBAL_FUNC(interlocked_cmpxchg,
@@ -395,6 +324,80 @@ __ASM_GLOBAL_FUNC(interlocked_xchg_add,
                   "beq   $1,L0xchg_add\n\t"
                   "mb")
 
+
 #else
-# error You must implement the interlocked* functions for your CPU
+
+#include <pthread.h>
+
+static pthread_mutex_t interlocked_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+int interlocked_cmpxchg( int *dest, int xchg, int compare )
+{
+    pthread_mutex_lock( &interlocked_mutex );
+
+    if (*dest == compare)
+        *dest = xchg;
+    else
+        compare = *dest;
+
+    pthread_mutex_unlock( &interlocked_mutex );
+    return compare;
+}
+
+void *interlocked_cmpxchg_ptr( void **dest, void *xchg, void *compare )
+{
+    pthread_mutex_lock( &interlocked_mutex );
+
+    if (*dest == compare)
+        *dest = xchg;
+    else
+        compare = *dest;
+
+    pthread_mutex_unlock( &interlocked_mutex );
+    return compare;
+}
+
+__int64 interlocked_cmpxchg64( __int64 *dest, __int64 xchg, __int64 compare )
+{
+    pthread_mutex_lock( &interlocked_mutex );
+
+    if (*dest == compare)
+        *dest = xchg;
+    else
+        compare = *dest;
+
+    pthread_mutex_unlock( &interlocked_mutex );
+    return compare;
+}
+
+int interlocked_xchg( int *dest, int val )
+{
+    int retv;
+    pthread_mutex_lock( &interlocked_mutex );
+    retv = *dest;
+    *dest = val;
+    pthread_mutex_unlock( &interlocked_mutex );
+    return retv;
+}
+
+void *interlocked_xchg_ptr( void **dest, void *val )
+{
+    void *retv;
+    pthread_mutex_lock( &interlocked_mutex );
+    retv = *dest;
+    *dest = val;
+    pthread_mutex_unlock( &interlocked_mutex );
+    return retv;
+}
+
+int interlocked_xchg_add( int *dest, int incr )
+{
+    int retv;
+    pthread_mutex_lock( &interlocked_mutex );
+    retv = *dest;
+    *dest += incr;
+    pthread_mutex_unlock( &interlocked_mutex );
+    return retv;
+}
+
 #endif




More information about the wine-cvs mailing list