diff options
Diffstat (limited to 'winsup/cygwin/winbase.h')
-rw-r--r-- | winsup/cygwin/winbase.h | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/winsup/cygwin/winbase.h b/winsup/cygwin/winbase.h index 15d16a429..351d320a4 100644 --- a/winsup/cygwin/winbase.h +++ b/winsup/cygwin/winbase.h @@ -1,43 +1,50 @@ #include_next "winbase.h" -#ifdef EXPCGF -#define DECLARE_TLS_STORAGE char **tls[4096] __attribute__ ((unused)) -#else -#define DECLARE_TLS_STORAGE do {} while (0) -#define _WINBASE2_H -#endif - #ifndef _WINBASE2_H #define _WINBASE2_H -extern __inline__ long ilockincr (long *m) +extern __inline__ long +ilockincr (long *m) { register int __res; __asm__ __volatile__ ("\n\ movl $1,%0\n\ lock xadd %0,(%1)\n\ inc %0\n\ - ": "=a" (__res), "=r" (m): "1" (m)); + ": "=a" (__res), "=q" (m): "1" (m)); return __res; } -extern __inline__ long ilockdecr (long *m) + +extern __inline__ long +ilockdecr (long *m) { register int __res; __asm__ __volatile__ ("\n\ movl $0xffffffff,%0\n\ lock xadd %0,(%1)\n\ dec %0\n\ - ": "=a" (__res), "=r" (m): "1" (m)); + ": "=a" (__res), "=q" (m): "1" (m)); return __res; } -extern __inline__ long ilockexch (long *t, long v) + +extern __inline__ long +ilockexch (long *t, long v) { register int __res; __asm__ __volatile__ ("\n\ - movl (%2),%0\n\ 1: lock cmpxchgl %3,(%1)\n\ jne 1b\n\ - ": "=a" (__res), "=c" (t): "1" (t), "d" (v)); + ": "=a" (__res), "=q" (t): "1" (t), "q" (v), "0" (*t)); + return __res; +} + +extern __inline__ long +ilockcmpexch (long *t, long v, long c) +{ + register int __res; + __asm__ __volatile__ ("\n\ + lock cmpxchgl %3,(%1)\n\ + ": "=a" (__res), "=q" (t) : "1" (t), "q" (v), "0" (c)); return __res; } @@ -47,7 +54,13 @@ extern __inline__ long ilockexch (long *t, long v) #define InterlockedDecrement ilockdecr #undef InterlockedExchange #define InterlockedExchange ilockexch +#undef InterlockedCompareExchange +#define InterlockedCompareExchange ilockcmpexch +#ifndef EXPCGf +#define DECLARE_TLS_STORAGE do {} while (0) +#else +#define DECLARE_TLS_STORAGE char **tls[4096] __attribute__ ((unused)) extern long tls_ix; extern char * volatile *__stackbase __asm__ ("%fs:4"); @@ -87,4 +100,5 @@ my_tlsfree (DWORD ix) #define TlsSetValue my_tlssetvalue #undef TlsFree #define TlsFree my_tlsfree +#endif /*EXPCGF*/ #endif /*_WINBASE2_H*/ |