d7c0a0cff6ee13d0a08ff5ef1e09bcbef45ba449
6 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
8 typedef unsigned int uint
;
23 typedef struct vg_tex2d vg_tex2d
;
31 #define vg_static_assert _Static_assert
32 #define vg_list_size( A ) (sizeof(A)/sizeof(A[0]))
41 #include <semaphore.h>
43 typedef sem_t vg_semaphore
;
44 typedef pthread_mutex_t vg_mutex
;
46 static int vg_semaphore_init( vg_semaphore
*sem
, u32 value
)
48 if( !sem_init( sem
, 0, value
) )
54 static int vg_semaphore_wait( vg_semaphore
*sem
)
56 if( !sem_wait( sem
) )
62 static int vg_semaphore_post( vg_semaphore
*sem
)
64 if( !sem_post( sem
) )
70 static void vg_semaphore_free( vg_semaphore
*sem
)
75 static int vg_mutex_init( vg_mutex
*mutex
)
77 memset( mutex
, 0, sizeof(vg_mutex
) );
81 static int vg_mutex_lock( vg_mutex
*mutex
)
83 if( !pthread_mutex_lock( mutex
) )
89 static int vg_mutex_unlock( vg_mutex
*mutex
)
91 if( !pthread_mutex_unlock( mutex
) )
97 static void vg_mutex_free( vg_mutex
*mutex
)
105 int vg_thread_run( void *pfunc
, void *data
)
108 HANDLE hThread
= CreateThread
110 NULL
, /* Thread attributes */
111 0, /* Stack size (0 = use default) */
112 pfunc
, /* Thread start address */
113 data
, /* Parameter to pass to the thread */
114 0, /* Creation flags */
118 if ( hThread
== NULL
)
121 * Thread creation failed.
122 * More details can be retrieved by calling GetLastError()
128 CloseHandle( hThread
);
133 if( pthread_create( &hThread
, NULL
, pfunc
, data
) )
139 pthread_detach( hThread
);
145 static void vg_sleep_ms( long msec
)
149 ts
.tv_sec
= msec
/ 1000;
150 ts
.tv_nsec
= (msec
% 1000) * 1000000;
151 nanosleep( &ts
, &ts
);
154 /* diff two timespecs in MS */
155 static double vg_time_diff( struct timespec start
, struct timespec end
)
157 double elapsed
= 1000.0*end
.tv_sec
+ 1e-6*end
.tv_nsec
158 - (1000.0*start
.tv_sec
+ 1e-6*start
.tv_nsec
);
163 #define VG_MIN( A, B ) ((A)<(B)?(A):(B))
164 #define VG_MAX( A, B ) ((A)>(B)?(A):(B))
166 static void *buffer_reserve( void *buffer
, u32 count
, u32
*cap
, u32 amount
,
169 if( count
+amount
> *cap
)
171 *cap
= VG_MAX( (*cap
)*2, (*cap
)+amount
);
173 return realloc( buffer
, (*cap
) * emsize
);
179 static void *buffer_fix( void *buffer
, u32 count
, u32
*cap
, size_t emsize
)
182 return realloc( buffer
, (*cap
) * emsize
);