diff options
Diffstat (limited to 'winsup/cygwin/winbase.h')
-rw-r--r-- | winsup/cygwin/winbase.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/winsup/cygwin/winbase.h b/winsup/cygwin/winbase.h new file mode 100644 index 000000000..d72bb0893 --- /dev/null +++ b/winsup/cygwin/winbase.h @@ -0,0 +1,83 @@ +#include_next "winbase.h" + +#ifndef _WINBASE2_H +#define _WINBASE2_H + +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)); + return __res; +} +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)); + return __res; +} +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)); + return __res; +} + +#undef InterlockedIncrement +#define InterlockedIncrement ilockincr +#undef InterlockedDecrement +#define InterlockedDecrement ilockdecr +#undef InterlockedExchange +#define InterlockedExchange ilockexch + +extern long tls_ix; +extern char * volatile *__stackbase __asm__ ("%fs:4"); + +extern __inline__ DWORD +my_tlsalloc () +{ + DWORD n = ilockdecr (&tls_ix); + __stackbase[tls_ix] = NULL; + return n; +} + +extern __inline__ BOOL +my_tlssetvalue (DWORD ix, void *val) +{ + __stackbase[ix] = (char *) val; + return 1; +} + +extern __inline__ void * +my_tlsgetvalue (DWORD ix) +{ + return __stackbase[ix]; +} + +extern __inline__ BOOL +my_tlsfree (DWORD ix) +{ + /* nothing for now */ + return 1; +} + +#undef TlsAlloc +#define TlsAlloc my_tlsalloc +#undef TlsGetValue +#define TlsGetValue my_tlsgetvalue +#undef TlsSetValue +#define TlsSetValue my_tlssetvalue +#undef TlsFree +#define TlsFree my_tlsfree +#endif /*_WINBASE2_H*/ |