Release 960928
[wine/multimedia.git] / win32 / thread.c
blobaccc9f4b30f4b625bc44332f9c450e6aa4c22c47
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 void
71 ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
72 /* hmm */
75 /***********************************************************************
76 * Tls is available only for the single thread
77 * (BTW: TLS means Thread Local Storage)
79 static LPVOID* Tls=0;
80 static int TlsCount=0;
82 DWORD TlsAlloc()
84 if(!Tls){
85 TlsCount++;
86 Tls=xmalloc(sizeof(LPVOID));
87 /* Tls needs to be zero initialized */
88 Tls[0]=0;
89 return 0;
91 Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
92 Tls[TlsCount-1]=0;
93 return TlsCount-1;
96 void TlsFree(DWORD index)
98 /*FIXME: should remember that it has been freed */
99 return;
102 LPVOID TlsGetValue(DWORD index)
104 if(index>=TlsCount)
106 /* FIXME: Set last error*/
107 return 0;
109 return Tls[index];
112 BOOL32 TlsSetValue(DWORD index,LPVOID value)
114 if(index>=TlsCount)
116 /* FIXME: Set last error*/
117 return FALSE;
119 Tls[index]=value;
120 return TRUE;
123 /* FIXME: This is required to work cross-addres space as well */
124 static CRITICAL_SECTION interlocked;
125 static int interlocked_init;
127 static void get_interlocked()
129 if(!interlocked_init)
130 InitializeCriticalSection(&interlocked);
131 interlocked_init=1;
132 EnterCriticalSection(&interlocked);
135 static void release_interlocked()
137 LeaveCriticalSection(&interlocked);
140 /***********************************************************************
141 * InterlockedIncrement
143 LONG InterlockedIncrement(LPLONG lpAddend)
145 int ret;
146 get_interlocked();
147 (*lpAddend)++;
148 ret=*lpAddend;
149 release_interlocked();
150 return ret;
153 /***********************************************************************
154 * InterlockedDecrement
156 LONG InterlockedDecrement(LPLONG lpAddend)
158 int ret;
159 get_interlocked();
160 (*lpAddend)--;
161 ret=*lpAddend;
162 release_interlocked();
163 return ret;
166 /***********************************************************************
167 * InterlockedExchange
169 LONG InterlockedExchange(LPLONG target, LONG value)
171 int ret;
172 get_interlocked();
173 ret=*target;
174 *target=value;
175 release_interlocked();
176 return ret;