Release 960811
[wine/hacks.git] / win32 / thread.c
blob6b67874e7cde05c4740002ff0e69a5db9d323f45
1 /*
2 * Win32 kernel functions
4 * Copyright 1995 Martin von Loewis
5 */
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <string.h>
10 #include "windows.h"
11 #include "winbase.h"
12 #include "winerror.h"
13 #include "stddebug.h"
14 #include "debug.h"
15 #include "xmalloc.h"
17 /***********************************************************************
18 * GetCurrentThreadId (KERNEL32.200)
21 int GetCurrentThreadId(void)
23 return getpid();
26 /***********************************************************************
27 * GetThreadContext (KERNEL32.294)
29 BOOL GetThreadContext(HANDLE hThread, void *lpContext)
31 return FALSE;
33 /***********************************************************************
34 * GetCurrentThread (KERNEL32.200)
36 HANDLE GetCurrentThread(void)
38 return 0;
41 /**********************************************************************
42 * Critical Sections are currently ignored
44 void InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
46 memset(lpCrit,0,sizeof(CRITICAL_SECTION));
49 void EnterCriticalSection(CRITICAL_SECTION* lpCrit)
51 if (lpCrit->LockCount)
52 fprintf( stderr, "Error: re-entering critical section %08lx\n",
53 (DWORD)lpCrit );
54 lpCrit->LockCount++;
57 void LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
59 if (!lpCrit->LockCount)
60 fprintf( stderr, "Error: leaving critical section %08lx again\n",
61 (DWORD)lpCrit );
62 lpCrit->LockCount--;
65 void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
67 return;
70 /***********************************************************************
71 * Tls is available only for the single thread
72 * (BTW: TLS means Thread Local Storage)
74 static LPVOID* Tls=0;
75 static int TlsCount=0;
77 DWORD TlsAlloc()
79 if(!Tls){
80 TlsCount++;
81 Tls=xmalloc(sizeof(LPVOID));
82 /* Tls needs to be zero initialized */
83 Tls[0]=0;
84 return 0;
86 Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
87 Tls[TlsCount-1]=0;
88 return TlsCount-1;
91 void TlsFree(DWORD index)
93 /*FIXME: should remember that it has been freed */
94 return;
97 LPVOID TlsGetValue(DWORD index)
99 if(index>=TlsCount)
101 /* FIXME: Set last error*/
102 return 0;
104 return Tls[index];
107 BOOL32 TlsSetValue(DWORD index,LPVOID value)
109 if(index>=TlsCount)
111 /* FIXME: Set last error*/
112 return FALSE;
114 Tls[index]=value;
115 return TRUE;
118 /* FIXME: This is required to work cross-addres space as well */
119 static CRITICAL_SECTION interlocked;
120 static int interlocked_init;
122 static void get_interlocked()
124 if(!interlocked_init)
125 InitializeCriticalSection(&interlocked);
126 interlocked_init=1;
127 EnterCriticalSection(&interlocked);
130 static void release_interlocked()
132 LeaveCriticalSection(&interlocked);
135 /***********************************************************************
136 * InterlockedIncrement
138 LONG InterlockedIncrement(LPLONG lpAddend)
140 int ret;
141 get_interlocked();
142 (*lpAddend)++;
143 ret=*lpAddend;
144 release_interlocked();
145 return ret;
148 /***********************************************************************
149 * InterlockedDecrement
151 LONG InterlockedDecrement(LPLONG lpAddend)
153 int ret;
154 get_interlocked();
155 (*lpAddend)--;
156 ret=*lpAddend;
157 release_interlocked();
158 return ret;
161 /***********************************************************************
162 * InterlockedExchange
164 LONG InterlockedExchange(LPLONG target, LONG value)
166 int ret;
167 get_interlocked();
168 ret=*target;
169 *target=value;
170 release_interlocked();
171 return ret;