Gears-C/src/platform/platform_windows_public.c

164 lines
2.7 KiB
C

// ::Platform::Windows::Memory::Start::
rawptr
pMemAlloc(usize size)
{
return (rawptr)VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
}
rawptr
pMemAllocZeroed(usize size)
{
rawptr mem = pMemAlloc(size);
MemZero(mem, size);
return mem;
}
void
pMemFree(rawptr ptr, usize size)
{
Assert(VirtualFree(ptr, size, MEM_RELEASE), "pMemFree failure");
}
// ::Platform::Windows::Memory::End::
// ::Platform::Windows::Print::Start::
i32
pWriteStdOut(rawptr buf, i32 len)
{
return WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, len, NULL, NULL);
}
i32
pWriteStdErr(rawptr buf, i32 len)
{
return WriteConsole(GetStdHandle(STD_ERROR_HANDLE), buf, len, NULL, NULL);
}
// ::Platform::Windows::Print::End::
// ::Platform::Functions::Directory::Start::
b32
pDirNavigate(c8 *dir)
{
return !(b32)SetCurrentDirectory(dir);
}
// ::Platform::Functions::Directory::End::
// ::Platform::Windows::Profiling::Functions::Start::
static inline u64
pCPUTimerRead()
{
return __rdtsc();
}
// ::Platform::Windows::Profiling::Functions::End::
// ::Platform::Windows::Async::Start::
static pThread
pThreadInit(rawptr proc, rawptr param)
{
pThread thread = {0};
CreateThread(NULL, 0, proc, param, 0, NULL);
return thread;
}
static void
pThreadSuspend(pThread *thread)
{
SuspendThread(thread->handle);
}
static void
pThreadWake(pThread *thread)
{
ResumeThread(thread->handle);
}
static void
pThreadKill()
{
ExitThread(0);
}
// ::Platform::Windows::Async::End::
// ::Platform::Windows::Atomics::Start::
static inline void
pAtomicSignalFenceSeqCst()
{
_ReadWriteBarrier();
}
static inline u32
pAtomicFetchSubU32(u32 volatile *ptr, u32 count)
{
LONG decrement = (LONG)count;
return (u32)InterlockedAddAcquire((LONG volatile *)ptr, -decrement) + decrement;
}
static inline u32
pAtomicFetchIncrU32(u32 volatile *ptr)
{
return (u32)InterlockedIncrementAcquire((LONG volatile *)ptr) - 1;
}
static inline void
pAtomicIncrU32(u32 volatile *ptr)
{
InterlockedIncrementRelease((LONG volatile *)ptr);
}
static inline u32
pAtomicLoadU32(u32 volatile *ptr)
{
return (u32)InterlockedOrAcquire((LONG volatile *)ptr, 0);
}
static inline void
pAtomicStoreB32(b32 volatile *ptr, b32 value)
{
_InterlockedExchange_HLERelease((LONG volatile *)ptr, (LONG)value);
}
static inline b32
pAtomicCompareExchangeB32(b32 volatile *ptr, b32 *expect, b32 desired)
{
return (b32)InterlockedCompareExchangeAcquire((LONG volatile *)ptr, (LONG)desired, (LONG)*expect);
}
// ::Platform::Windows::Atomics::End::
// ::Platform::Windows::Files::Start::
static b8
pDirIsVisible(c8 *dir_name)
{
WIN32_FIND_DATA find_data;
HANDLE handle;
return (handle = FindFirstFile(dir_name, &find_data)) != INVALID_HANDLE_VALUE;
}
// ::Platform::Windows::Files::End::