This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
Re: [PATCH?] Separate pthread patches, #2 take 1 redux
- From: Dave Korn <dave dot korn dot cygwin at googlemail dot com>
- To: Dave Korn <dave dot korn dot cygwin at googlemail dot com>
- Cc: cygwin-patches at cygwin dot com
- Date: Thu, 04 Jun 2009 00:53:18 +0100
- Subject: Re: [PATCH?] Separate pthread patches, #2 take 1 redux
- References: <4A270656.8090704@gmail.com> <4A270BA4.3080602@gmail.com>
Dave Korn wrote:
> Dave Korn wrote:
>> The attached patch implements ilockexch and ilockcmpexch, using the inline
>> asm definition from __arch_compare_and_exchange_val_32_acq in
>> glibc-2.10.1/sysdeps/i386/i486/bits/atomic.h, trivially expanded inline rather
>> than in its original preprocessor macro form.
And this one, just to have the full set in the same place, is the version
that I originally suggested. It generates correct and efficient code:
L215:
.loc 3 127 0
movl __ZN13pthread_mutex7mutexesE+8, %eax # mutexes.head, D.28638
movl %eax, 36(%ebx) # D.28638, <variable>.next
.loc 2 53 0
/APP
# 53 "/gnu/winsup/src/winsup/cygwin/winbase.h" 1
lock cmpxchgl %ebx,__ZN13pthread_mutex7mutexesE+8 # this,
# 0 "" 2
/NO_APP
.loc 3 126 0
cmpl %eax, 36(%ebx) # D.28635, <variable>.next
jne L215 #,
but is more risky. No ChangeLog because it's not going to be approved, I'm
posting it just for completeness and future reference.
cheers,
DaveK
Index: winsup/cygwin/winbase.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/winbase.h,v
retrieving revision 1.14
diff -p -u -r1.14 winbase.h
--- winsup/cygwin/winbase.h 12 Jul 2008 18:09:17 -0000 1.14
+++ winsup/cygwin/winbase.h 3 Jun 2009 17:38:06 -0000
@@ -38,21 +38,21 @@ ilockdecr (volatile long *m)
extern __inline__ long
ilockexch (volatile long *t, long v)
{
- register int __res;
+ register long __res __asm__ ("%eax") = *t;
__asm__ __volatile__ ("\n\
-1: lock cmpxchgl %3,(%1)\n\
+1: lock cmpxchgl %2,%1\n\
jne 1b\n\
- ": "=a" (__res), "=q" (t): "1" (t), "q" (v), "0" (*t): "cc");
+ ": "+a" (__res), "=m" (*t): "q" (v), "m" (*t) : "memory", "cc");
return __res;
}
extern __inline__ long
ilockcmpexch (volatile long *t, long v, long c)
{
- register int __res;
+ register long __res __asm ("%eax") = c;
__asm__ __volatile__ ("\n\
- lock cmpxchgl %3,(%1)\n\
- ": "=a" (__res), "=q" (t) : "1" (t), "q" (v), "0" (c): "cc");
+ lock cmpxchgl %2,%1\n\
+ ": "+a" (__res), "=m" (*t) : "q" (v), "m" (*t) : "memory", "cc");
return __res;
}