Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/winbase.h')
-rw-r--r--winsup/cygwin/winbase.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/winsup/cygwin/winbase.h b/winsup/cygwin/winbase.h
new file mode 100644
index 000000000..801badc44
--- /dev/null
+++ b/winsup/cygwin/winbase.h
@@ -0,0 +1,84 @@
+#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 __inline__ DWORD
+my_tlsalloc ()
+{
+ return (DWORD) ilockincr (&tls_ix);
+}
+
+extern __inline__ BOOL
+my_tlssetvalue (DWORD ix, void *val)
+{
+ char **stackbase;
+ __asm__ volatile ("movl %%fs:4,%0": "=g" (stackbase));
+ stackbase[-ix] = (char *) val;
+ return 1;
+}
+
+extern __inline__ void *
+my_tlsgetvalue (DWORD ix)
+{
+ char **stackbase;
+ __asm__ volatile ("movl %%fs:4,%0": "=g" (stackbase));
+ 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*/