bad char
[vg.git] / src / vg / vg_platform.h
1 #ifndef VG_PLATFORM_H
2 #define VG_PLATFORM_H
3
4 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
5
6 typedef unsigned int uint;
7
8 typedef int v2i[2];
9 typedef int v3i[3];
10 typedef int v4i[4];
11 typedef float v2f[2];
12 typedef float v3f[3];
13 typedef float v4f[4];
14 typedef v2f m2x2f[2];
15 typedef v3f m3x3f[3];
16 typedef v3f m4x3f[4];
17 typedef v4f m4x4f[4];
18 typedef v3f boxf[2];
19
20 // Resource types
21 typedef struct vg_tex2d vg_tex2d;
22
23 struct vg_achievement
24 {
25 int is_set;
26 const char *name;
27 };
28
29 #define vg_static_assert _Static_assert
30 #define vg_list_size( A ) (sizeof(A)/sizeof(A[0]))
31
32 /* Pthred emulation for windows */
33 #ifdef _WIN32
34 #include <windows.h>
35 #define MUTEX_TYPE HANDLE
36 #define MUTEX_INITIALIZER NULL
37 #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
38
39 /* TODO: Why is this defined but never used? */
40 #define MUTEX_CLEANUP(x) (CloseHandle(x))
41 #define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x))
42 #define MUTEX_UNLOCK(x) (ReleaseMutex(x))
43
44 int emulate_pthread_mutex_lock( volatile MUTEX_TYPE *mx )
45 {
46 if( *mx == NULL ) /* static initializer? */
47 {
48 HANDLE p = CreateMutex( NULL, FALSE, NULL );
49 if( InterlockedCompareExchangePointer( (PVOID*)mx, (PVOID)p, NULL )
50 != NULL )
51 CloseHandle(p);
52 }
53
54 return WaitForSingleObject( *mx, INFINITE ) == WAIT_FAILED;
55 }
56 #else
57 #include <pthread.h>
58 #define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
59 #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
60 #define MUTEX_TYPE pthread_mutex_t
61 #define MUTEX_INITIALIZER {0}
62 #endif
63
64
65 int vg_thread_run( void *pfunc, void *data )
66 {
67 #ifdef _WIN32
68 HANDLE hThread = CreateThread
69 (
70 NULL, /* Thread attributes */
71 0, /* Stack size (0 = use default) */
72 pfunc, /* Thread start address */
73 data, /* Parameter to pass to the thread */
74 0, /* Creation flags */
75 NULL /* Thread id */
76 );
77
78 if ( hThread == NULL )
79 {
80 /*
81 * Thread creation failed.
82 * More details can be retrieved by calling GetLastError()
83 */
84 return 1;
85 }
86 else
87 {
88 CloseHandle( hThread );
89 return 0;
90 }
91 #else
92 pthread_t hThread;
93 if( pthread_create( &hThread, NULL, pfunc, data ) )
94 {
95 return 1;
96 }
97 else
98 {
99 pthread_detach( hThread );
100 return 0;
101 }
102 #endif
103 }
104
105 #endif