+static int vg_semaphore_init( vg_semaphore *sem, u32 value )
+{
+ return !sem_init( sem, 0, value );
+}
+
+static int vg_semaphore_trywait( vg_semaphore *sem )
+{
+ return !sem_trywait( sem );
+}
+
+static int vg_semaphore_wait( vg_semaphore *sem )
+{
+ return !sem_wait( sem );
+}
+
+static int vg_semaphore_post( vg_semaphore *sem )
+{
+ return !sem_post( sem );
+}
+
+static void vg_semaphore_free( vg_semaphore *sem )
+{
+ sem_destroy( sem );
+}
+
+static int vg_mutex_init( vg_mutex *mutex )
+{
+ memset( mutex, 0, sizeof(vg_mutex) );
+ return 1;
+}
+
+static int vg_mutex_lock( vg_mutex *mutex )
+{
+ if( !pthread_mutex_lock( mutex ) )
+ return 1;
+ else
+ return 0;
+}
+
+static int vg_mutex_unlock( vg_mutex *mutex )
+{
+ if( !pthread_mutex_unlock( mutex ) )
+ return 1;
+ else
+ return 0;
+}
+
+static void vg_mutex_free( vg_mutex *mutex )
+{
+
+}
+
+static void vg_sleep_ms( long msec )
+{
+ struct timespec ts;
+
+ ts.tv_sec = msec / 1000;
+ ts.tv_nsec = (msec % 1000) * 1000000;
+ nanosleep( &ts, &ts );
+}
+
+/* diff two timespecs in MS */
+static double vg_time_diff( struct timespec start, struct timespec end )
+{
+ double elapsed = 1000.0*end.tv_sec + 1e-6*end.tv_nsec
+ - (1000.0*start.tv_sec + 1e-6*start.tv_nsec);
+
+ return elapsed;
+}
+
+#endif
+
+#define VG_MIN( A, B ) ((A)<(B)?(A):(B))
+#define VG_MAX( A, B ) ((A)>(B)?(A):(B))
+
+static void *buffer_reserve( void *buffer, u32 count, u32 *cap, u32 amount,
+ size_t emsize )
+{
+ if( count+amount > *cap )
+ {
+ *cap = VG_MAX( (*cap)*2, (*cap)+amount );
+ return vg_realloc( buffer, (*cap) * emsize );
+ }
+
+ return buffer;
+}
+
+static void *buffer_fix( void *buffer, u32 count, u32 *cap, size_t emsize )
+{
+ *cap = count;
+ return vg_realloc( buffer, (*cap) * emsize );
+}
+