Fix problem exposing platform w/o implementation

This commit is contained in:
Doyle Thai 2017-07-03 15:17:09 +10:00
parent f8a4d4fe4b
commit 924aa84e7d
2 changed files with 40 additions and 19 deletions

58
dqn.h
View File

@ -4,7 +4,11 @@
/* /*
#define DQN_IMPLEMENTATION // Enable the implementation #define DQN_IMPLEMENTATION // Enable the implementation
// Define this wherever you want access to DQN code that uses the platform.
#define DQN_PLATFORM_HEADER // Enable function prototypes for xplatform/platform code
// NOTE: For platform code, it's one or the other or you will get compilation problems. // NOTE: For platform code, it's one or the other or you will get compilation problems.
// Define this in ONE and only ONE file to enable the implementation of platform code.
#define DQN_WIN32_IMPLEMENTATION // Enable Win32 Code, but only if _WIN32 or _WIN64 is already defined. Also requires DQN_IMPLEMENTATION. #define DQN_WIN32_IMPLEMENTATION // Enable Win32 Code, but only if _WIN32 or _WIN64 is already defined. Also requires DQN_IMPLEMENTATION.
#define DQN_UNIX_IMPLEMENTATION // Enable Unix Code, but only if __linux__ is already defined. Also requires DQN_IMPLEMENTATION. #define DQN_UNIX_IMPLEMENTATION // Enable Unix Code, but only if __linux__ is already defined. Also requires DQN_IMPLEMENTATION.
@ -77,16 +81,22 @@
// This needs to be above the portable layer so that, if the user requests // This needs to be above the portable layer so that, if the user requests
// a platform implementation, platform specific implementations in the portable // a platform implementation, platform specific implementations in the portable
// layer will get activated. // layer will get activated.
#if (defined(_WIN32) || defined(_WIN64)) && defined(DQN_WIN32_IMPLEMENTATION) #if (defined(_WIN32) || defined(_WIN64))
#define DQN_XPLATFORM_LAYER #define DQN_IS_WIN32 1
#define DQN_WIN32_PLATFORM #elif defined(__linux__)
#elif defined(__linux__) && defined(DQN_UNIX_IMPLEMENTATION) #define DQN_IS_UNIX 1
#define DQN_XPLATFORM_LAYER #endif
#define DQN_UNIX_PLATFORM
#if defined(DQN_IS_WIN32) && defined(DQN_WIN32_IMPLEMENTATION)
#define DQN_XPLATFORM_LAYER 1
#define DQN_WIN32_PLATFORM 1
#elif defined(DQN_IS_UNIX) && defined(DQN_UNIX_IMPLEMENTATION)
#define DQN_XPLATFORM_LAYER 1
#define DQN_UNIX_PLATFORM 1
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
#define DQN_CPP_MODE #define DQN_CPP_MODE 1
#endif #endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1070,13 +1080,20 @@ DQN_FILE_SCOPE void Dqn_QuickSort(T *const array, const u32 size,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Functions in the Cross Platform are guaranteed to be supported in both Unix // Functions in the Cross Platform are guaranteed to be supported in both Unix
// and Win32 // and Win32
#ifdef DQN_XPLATFORM_LAYER
#if defined(DQN_WIN32_PLATFORM) // NOTE(doyle): DQN_PLATFORM_HEADER is enabled by the user to have the function prototypes be
#define WIN32_LEAN_AND_MEAN // visible. DQN_PLATFORM_H is like a normal header guard that ensures singular declaration of
// functions.
#ifdef DQN_PLATFORM_HEADER
#ifndef DQN_PLATFORM_H
#define DQN_PLATFORM_H
#if defined(DQN_IS_WIN32)
#define WIN32_LEAN_AND_MEAN 1
#include <Windows.h> #include <Windows.h>
#elif defined(DQN_UNIX_PLATFORM) #elif defined(DQN_IS_UNIX)
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
@ -1186,12 +1203,15 @@ DQN_FILE_SCOPE f64 DqnTimer_NowInS ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
typedef struct DqnLock typedef struct DqnLock
{ {
#if defined(DQN_WIN32_PLATFORM) #if defined(DQN_IS_WIN32)
CRITICAL_SECTION win32Handle; CRITICAL_SECTION win32Handle;
#elif defined(DQN_UNIX_PLATFORM) #elif defined(DQN_IS_UNIX)
pthread_mutex_t unixHandle; pthread_mutex_t unixHandle;
#else
#error Unknown platform
#endif #endif
// Win32 only, when trying to acquire a locked lock, it is the number of spins permitted // Win32 only, when trying to acquire a locked lock, it is the number of spins permitted
@ -1269,10 +1289,10 @@ typedef struct DqnJobQueue
i32 volatile jobToExecuteIndex; i32 volatile jobToExecuteIndex;
i32 volatile numJobsToComplete; i32 volatile numJobsToComplete;
#if defined(DQN_WIN32_PLATFORM) #if defined(DQN_IS_WIN32)
void *semaphore; void *semaphore;
#elif defined(DQN_UNIX_PLATFORM) #elif defined(DQN_IS_UNIX)
sem_t semaphore; sem_t semaphore;
#else #else
@ -1342,8 +1362,6 @@ DQN_FILE_SCOPE i32 DqnAtomic_Add32(i32 volatile *const src, const i32 value);
// numCores: numThreadsPerCore: Can be NULL, the function will just skip it. // numCores: numThreadsPerCore: Can be NULL, the function will just skip it.
DQN_FILE_SCOPE void DqnPlatform_GetNumThreadsAndCores(u32 *const numCores, u32 *const numThreadsPerCore); DQN_FILE_SCOPE void DqnPlatform_GetNumThreadsAndCores(u32 *const numCores, u32 *const numThreadsPerCore);
#endif // DQN_XPLATFORM_LAYER
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// #Platform Public API // #Platform Public API
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1353,7 +1371,7 @@ DQN_FILE_SCOPE void DqnPlatform_GetNumThreadsAndCores(u32 *const numCores, u32 *
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// #Win32Platform Public API // #Win32Platform Public API
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#ifdef DQN_WIN32_PLATFORM #if defined(DQN_IS_WIN32)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Platform > #DqnWin32 Public API - Common Win32 API Helpers // Platform > #DqnWin32 Public API - Common Win32 API Helpers
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -1385,8 +1403,10 @@ DQN_FILE_SCOPE void DqnWin32_OutputDebugString(const char *const formatStr, ...)
// buf: Filled with the path to the executable file. // buf: Filled with the path to the executable file.
// return: The offset to the last backslash. -1 if bufLen was not large enough or buf is null. // return: The offset to the last backslash. -1 if bufLen was not large enough or buf is null.
DQN_FILE_SCOPE i32 DqnWin32_GetEXEDirectory(char *const buf, const u32 bufLen); DQN_FILE_SCOPE i32 DqnWin32_GetEXEDirectory(char *const buf, const u32 bufLen);
#endif // DQN_IS_WIN32
#endif // DQN_PLATFORM_H
#endif // DQN_PLATFORM_HEADER
#endif // DQN_WIN32_PLATFORM
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// #External Code // #External Code

View File

@ -13,6 +13,7 @@
#pragma GCC diagnostic ignored "-Wfree-nonheap-object" #pragma GCC diagnostic ignored "-Wfree-nonheap-object"
#endif #endif
#define DQN_PLATFORM_HEADER
#define DQN_IMPLEMENTATION #define DQN_IMPLEMENTATION
#include "dqn.h" #include "dqn.h"