better structure
[vg.git] / src / vg / vg_platform.h
diff --git a/src/vg/vg_platform.h b/src/vg/vg_platform.h
new file mode 100644 (file)
index 0000000..b1986b9
--- /dev/null
@@ -0,0 +1,111 @@
+// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
+
+typedef uint8_t  u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+typedef int8_t i8;
+typedef int16_t i16;
+typedef int32_t i32;
+typedef int64_t i64;
+
+typedef unsigned int uint;
+
+typedef int            v2i[2];
+typedef int            v3i[3];
+typedef int            v4i[4];
+typedef float          v2f[2];
+typedef float          v3f[3];
+typedef float          v4f[4];
+typedef v2f                    m2x2f[2];
+typedef v3f                    m3x3f[3];
+typedef v3f                    m4x3f[4];
+typedef v3f                    boxf[2];
+
+// Resource types
+typedef struct vg_tex2d vg_tex2d;
+
+struct vg_achievement
+{
+       int is_set;
+       const char *name;
+};
+
+#define vg_static_assert _Static_assert
+
+#define vg_list_size( A ) (sizeof(A)/sizeof(A[0]))
+
+// THREADING
+// ==================================================================================================================
+
+// Pthred emulation for windows 
+#ifdef _WIN32
+       #include <windows.h>
+       #define MUTEX_TYPE             HANDLE
+       #define MUTEX_INITIALIZER      NULL
+       #define MUTEX_SETUP(x)         (x) = CreateMutex(NULL, FALSE, NULL)
+       #define MUTEX_CLEANUP(x)       (CloseHandle(x)) //TODO: Why is this defined but never used?
+       #define MUTEX_LOCK(x)          emulate_pthread_mutex_lock(&(x))
+       #define MUTEX_UNLOCK(x)        (ReleaseMutex(x))
+
+       int emulate_pthread_mutex_lock( volatile MUTEX_TYPE *mx )
+       { 
+               if( *mx == NULL ) /* static initializer? */
+               { 
+                       HANDLE p = CreateMutex( NULL, FALSE, NULL );
+                       if( InterlockedCompareExchangePointer( (PVOID*)mx, (PVOID)p, NULL ) != NULL )
+                               CloseHandle(p);
+               }
+               
+               return WaitForSingleObject( *mx, INFINITE ) == WAIT_FAILED;
+       }
+#else
+       #include <pthread.h>
+       #define MUTEX_LOCK(x)                   pthread_mutex_lock(&(x))
+       #define MUTEX_UNLOCK(x)                 pthread_mutex_unlock(&(x))
+       #define MUTEX_TYPE                              pthread_mutex_t
+       #define MUTEX_INITIALIZER               {0}
+#endif
+
+
+int vg_thread_run( void *pfunc, void *data )
+{
+#ifdef _WIN32
+       
+       HANDLE hThread = CreateThread
+       (
+               NULL,    // Thread attributes
+               0,       // Stack size (0 = use default)
+               pfunc,   // Thread start address
+               data,    // Parameter to pass to the thread
+               0,       // Creation flags
+               NULL            // Thread id
+       );
+       
+       if ( hThread == NULL )
+       {
+               // Thread creation failed.
+               // More details can be retrieved by calling GetLastError()
+               return 1;
+       }
+       else
+       {
+               CloseHandle( hThread );
+               return 0;
+       }
+       
+#else
+
+       pthread_t hThread;
+       if( pthread_create( &hThread, NULL, pfunc, data ) )
+       {
+               return 1;
+       }
+       else
+       {
+               pthread_detach( hThread );
+               return 0;
+       }
+
+#endif
+}