blob: accc9f4b30f4b625bc44332f9c450e6aa4c22c47 [file] [log] [blame]
/*
* Win32 kernel functions
*
* Copyright 1995 Martin von Loewis
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "windows.h"
#include "winbase.h"
#include "winerror.h"
#include "stddebug.h"
#include "debug.h"
#include "xmalloc.h"
/***********************************************************************
* GetCurrentThreadId (KERNEL32.200)
*/
int GetCurrentThreadId(void)
{
return getpid();
}
/***********************************************************************
* GetThreadContext (KERNEL32.294)
*/
BOOL GetThreadContext(HANDLE hThread, void *lpContext)
{
return FALSE;
}
/***********************************************************************
* GetCurrentThread (KERNEL32.200)
*/
HANDLE GetCurrentThread(void)
{
return 0;
}
/**********************************************************************
* Critical Sections are currently ignored
*/
void InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
{
memset(lpCrit,0,sizeof(CRITICAL_SECTION));
}
void EnterCriticalSection(CRITICAL_SECTION* lpCrit)
{
if (lpCrit->LockCount)
fprintf( stderr, "Error: re-entering critical section %08lx\n",
(DWORD)lpCrit );
lpCrit->LockCount++;
}
void LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
{
if (!lpCrit->LockCount)
fprintf( stderr, "Error: leaving critical section %08lx again\n",
(DWORD)lpCrit );
lpCrit->LockCount--;
}
void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
{
return;
}
void
ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
/* hmm */
}
/***********************************************************************
* Tls is available only for the single thread
* (BTW: TLS means Thread Local Storage)
*/
static LPVOID* Tls=0;
static int TlsCount=0;
DWORD TlsAlloc()
{
if(!Tls){
TlsCount++;
Tls=xmalloc(sizeof(LPVOID));
/* Tls needs to be zero initialized */
Tls[0]=0;
return 0;
}
Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
Tls[TlsCount-1]=0;
return TlsCount-1;
}
void TlsFree(DWORD index)
{
/*FIXME: should remember that it has been freed */
return;
}
LPVOID TlsGetValue(DWORD index)
{
if(index>=TlsCount)
{
/* FIXME: Set last error*/
return 0;
}
return Tls[index];
}
BOOL32 TlsSetValue(DWORD index,LPVOID value)
{
if(index>=TlsCount)
{
/* FIXME: Set last error*/
return FALSE;
}
Tls[index]=value;
return TRUE;
}
/* FIXME: This is required to work cross-addres space as well */
static CRITICAL_SECTION interlocked;
static int interlocked_init;
static void get_interlocked()
{
if(!interlocked_init)
InitializeCriticalSection(&interlocked);
interlocked_init=1;
EnterCriticalSection(&interlocked);
}
static void release_interlocked()
{
LeaveCriticalSection(&interlocked);
}
/***********************************************************************
* InterlockedIncrement
*/
LONG InterlockedIncrement(LPLONG lpAddend)
{
int ret;
get_interlocked();
(*lpAddend)++;
ret=*lpAddend;
release_interlocked();
return ret;
}
/***********************************************************************
* InterlockedDecrement
*/
LONG InterlockedDecrement(LPLONG lpAddend)
{
int ret;
get_interlocked();
(*lpAddend)--;
ret=*lpAddend;
release_interlocked();
return ret;
}
/***********************************************************************
* InterlockedExchange
*/
LONG InterlockedExchange(LPLONG target, LONG value)
{
int ret;
get_interlocked();
ret=*target;
*target=value;
release_interlocked();
return ret;
}