+
+VG_STATIC int vg_semaphore_init( vg_semaphore *sem, u32 value )
+{
+ return !sem_init( sem, 0, value );
+}
+
+VG_STATIC int vg_semaphore_trywait( vg_semaphore *sem )
+{
+ return !sem_trywait( sem );
+}
+
+VG_STATIC int vg_semaphore_wait( vg_semaphore *sem )
+{
+ return !sem_wait( sem );
+}
+
+VG_STATIC int vg_semaphore_post( vg_semaphore *sem )
+{
+ return !sem_post( sem );
+}
+
+VG_STATIC void vg_semaphore_free( vg_semaphore *sem )
+{
+ sem_destroy( sem );
+}
+
+VG_STATIC int vg_mutex_init( vg_mutex *mutex )
+{
+ memset( mutex, 0, sizeof(vg_mutex) );
+ return 1;
+}
+
+VG_STATIC int vg_mutex_lock( vg_mutex *mutex )
+{
+ if( !pthread_mutex_lock( mutex ) )
+ return 1;
+ else
+ return 0;
+}
+
+VG_STATIC int vg_mutex_unlock( vg_mutex *mutex )
+{
+ if( !pthread_mutex_unlock( mutex ) )
+ return 1;
+ else
+ return 0;
+}
+
+VG_STATIC void vg_mutex_free( vg_mutex *mutex )
+{
+
+}
+
+VG_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 */
+VG_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))
+
+#endif