2 * Win32 kernel functions
4 * Copyright 1995 Martin von Loewis
17 /***********************************************************************
18 * GetCurrentThreadId (KERNEL32.200)
21 int GetCurrentThreadId(void)
26 /***********************************************************************
27 * GetThreadContext (KERNEL32.294)
29 BOOL
GetThreadContext(HANDLE hThread
, void *lpContext
)
33 /***********************************************************************
34 * GetCurrentThread (KERNEL32.200)
36 HANDLE
GetCurrentThread(void)
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",
57 void LeaveCriticalSection(CRITICAL_SECTION
* lpCrit
)
59 if (!lpCrit
->LockCount
)
60 fprintf( stderr
, "Error: leaving critical section %08lx again\n",
65 void DeleteCriticalSection(CRITICAL_SECTION
* lpCrit
)
70 /***********************************************************************
71 * Tls is available only for the single thread
72 * (BTW: TLS means Thread Local Storage)
75 static int TlsCount
=0;
81 Tls
=xmalloc(sizeof(LPVOID
));
82 /* Tls needs to be zero initialized */
86 Tls
=xrealloc(Tls
,sizeof(LPVOID
)*(++TlsCount
));
91 void TlsFree(DWORD index
)
93 /*FIXME: should remember that it has been freed */
97 LPVOID
TlsGetValue(DWORD index
)
101 /* FIXME: Set last error*/
107 BOOL32
TlsSetValue(DWORD index
,LPVOID value
)
111 /* FIXME: Set last error*/
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
);
127 EnterCriticalSection(&interlocked
);
130 static void release_interlocked()
132 LeaveCriticalSection(&interlocked
);
135 /***********************************************************************
136 * InterlockedIncrement
138 LONG
InterlockedIncrement(LPLONG lpAddend
)
144 release_interlocked();
148 /***********************************************************************
149 * InterlockedDecrement
151 LONG
InterlockedDecrement(LPLONG lpAddend
)
157 release_interlocked();
161 /***********************************************************************
162 * InterlockedExchange
164 LONG
InterlockedExchange(LPLONG target
, LONG value
)
170 release_interlocked();