/* * Win32 kernel functions * * Copyright 1995 Martin von Loewis */ #include #include #include #include "windows.h" #include "winbase.h" #include "winerror.h" #include "stddebug.h" #include "debug.h" #include "xmalloc.h" /********************************************************************** * 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 */ } void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit) { /* hmm */ } /* 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; }