implement interlocked* functions on Alpha AXP

Steven Edwards steven_ed4153 at yahoo.com
Fri Sep 19 21:09:51 CDT 2003


Hello,
I know nothing about this except what I have learned in the past 4
hours
so.........

After looking at the interlocked code and reading how
PEACE and Mono implement these functions I think this will work. This
is assuming that the SUN code for implementing this is compatible with 
pthreads. I only get one warrning about a cast in interlocked_xchg_ptr 
so I assume I am on the right track with this. I have not done any work
at this low level before so is there was something wrong with using 
pthreads here? I am not worried about breaking compatiblity with
exsting
Win32/64 AXP apps as there are few left.

Changlog: Implement interlocked* function for the Alpha CPU

Index: wine/libs/port/interlocked.c
===================================================================
RCS file: /home/wine/wine/libs/port/interlocked.c,v
retrieving revision 1.3
diff -u -r1.3 interlocked.c
--- wine/libs/port/interlocked.c        2 Jul 2003 04:29:33 -0000      
1.3
+++ wine/libs/port/interlocked.c        20 Sep 2003 02:07:04 -0000
@@ -244,6 +244,65 @@
     _lwp_mutex_unlock( &interlocked_mutex );
     return retv;
 }
+
+#elif defined(__ALPHA__) || defined(__AXP__)
+/* This code was adapted from the Sparc port. After checking
+ * the way Mono and PEACE implement interlocked functions on
+ * pthreads I think it will work.
+ */
+#include <pthread.h>
+
+static pthread_mutex_t interlocked_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+long interlocked_cmpxchg( long *dest, long xchg, long 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;
+}
+
+long interlocked_xchg( long *dest, long val )
+{
+    long 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 )
+{
+    long retv;
+    pthread_mutex_lock( &interlocked_mutex );
+    retv = *dest;
+    *dest = val;
+    pthread_mutex_unlock( &interlocked_mutex );
+    return retv;
+}
+
+long interlocked_xchg_add( long *dest, long incr )
+{
+    long retv;
+    pthread_mutex_lock( &interlocked_mutex );
+    retv = *dest;
+    *dest += incr;
+    pthread_mutex_unlock( &interlocked_mutex );
+    return retv;
+}
+
 #else
 # error You must implement the interlocked* functions for your CPU
 #endif
+


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com



More information about the wine-devel mailing list