# error "Unknown platform/thread wrapping"
#endif
+#if defined(VGO_freebsd)
+#define LIBC_FUNC(ret_ty, f, args...) \
+ ret_ty I_WRAP_SONAME_FNNAME_ZZ(VG_Z_LIBC_SONAME,f)(args); \
+ ret_ty I_WRAP_SONAME_FNNAME_ZZ(VG_Z_LIBC_SONAME,f)(args)
+#endif
+
// Do a client request. These are macros rather than a functions so
// as to avoid having an extra frame in stack traces.
case EDEADLK: return "EDEADLK: Resource deadlock would occur";
case EOPNOTSUPP: return "EOPNOTSUPP: Operation not supported on "
"transport endpoint"; /* honest, guv */
+#if !defined(VGO_freebsd)
case ETIME: return "ETIME: Timer expired";
+#endif
default: return "hg_intercepts.c: lame_strerror(): "
"unhandled case -- please fix me!";
}
// glibc: pthread_create@@GLIBC_2.2.5
// darwin: pthread_create
// darwin: pthread_create_suspended_np (trapped)
+// FreeBSD: pthread_create
//
/* ensure this has its own frame, so as to make it more distinguishable
in suppressions */
void *(*start) (void *), void *arg) {
return pthread_create_WRK(thread, attr, start, arg);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucreate, // pthread_create
+ pthread_t *thread, const pthread_attr_t *attr,
+ void *(*start) (void *), void *arg) {
+ return pthread_create_WRK(thread, attr, start, arg);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucreate, // pthread_create
pthread_t *thread, const pthread_attr_t *attr,
// darwin: pthread_join
// darwin: pthread_join$NOCANCEL$UNIX2003
// darwin pthread_join$UNIX2003
+// FreeBSD: pthread_join
__attribute__((noinline))
static int pthread_join_WRK(pthread_t thread, void** value_pointer)
{
pthread_t thread, void** value_pointer) {
return pthread_join_WRK(thread, value_pointer);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZujoin, // pthread_join
+ pthread_t thread, void** value_pointer) {
+ return pthread_join_WRK(thread, value_pointer);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZujoinZa, // pthread_join*
pthread_t thread, void** value_pointer) {
#if !defined(VGO_solaris)
// glibc: pthread_mutex_init
// darwin: pthread_mutex_init
+// FreeBSD: pthread_mutex_init
PTH_FUNC(int, pthreadZumutexZuinit, // pthread_mutex_init
pthread_mutex_t *mutex,
pthread_mutexattr_t* attr)
// glibc: pthread_mutex_destroy
// darwin: pthread_mutex_destroy
// Solaris: mutex_destroy (pthread_mutex_destroy is a weak alias)
+// FreeBSD: pthread_mutex_destroy
__attribute__((noinline))
static int mutex_destroy_WRK(pthread_mutex_t *mutex)
{
return ret;
}
-#if defined(VGO_linux) || defined(VGO_darwin)
+#if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZumutexZudestroy, // pthread_mutex_destroy
pthread_mutex_t *mutex) {
return mutex_destroy_WRK(mutex);
// glibc: pthread_mutex_lock
// darwin: pthread_mutex_lock
// Solaris: mutex_lock (pthread_mutex_lock is a weak alias)
+// FreeBSD: pthread_mutex_lock
__attribute__((noinline))
static int mutex_lock_WRK(pthread_mutex_t *mutex)
{
return ret;
}
-#if defined(VGO_linux) || defined(VGO_darwin)
+#if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZumutexZulock, // pthread_mutex_lock
pthread_mutex_t *mutex) {
return mutex_lock_WRK(mutex);
// glibc: pthread_mutex_trylock
// darwin: pthread_mutex_trylock
// Solaris: mutex_trylock (pthread_mutex_trylock is a weak alias)
+// FreeBSD: pthread_mutext_trylock
//
// pthread_mutex_trylock. The handling needed here is very similar
// to that for pthread_mutex_lock, except that we need to tell
return ret;
}
-#if defined(VGO_linux) || defined(VGO_darwin)
+#if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZumutexZutrylock, // pthread_mutex_trylock
pthread_mutex_t *mutex) {
return mutex_trylock_WRK(mutex);
// glibc: pthread_mutex_timedlock
// darwin: (doesn't appear to exist)
// Solaris: pthread_mutex_timedlock
+// FreeBSD: pthread_mutex_timedlock
//
// pthread_mutex_timedlock. Identical logic to pthread_mutex_trylock.
__attribute__((noinline))
// glibc: pthread_mutex_unlock
// darwin: pthread_mutex_unlock
// Solaris: mutex_unlock (pthread_mutex_unlock is a weak alias)
+// FreeBSD: pthread_mutex_unlock
__attribute__((noinline))
static int mutex_unlock_WRK(pthread_mutex_t *mutex)
{
return ret;
}
-#if defined(VGO_linux) || defined(VGO_darwin)
+#if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZumutexZuunlock, // pthread_mutex_unlock
pthread_mutex_t *mutex) {
return mutex_unlock_WRK(mutex);
// darwin: pthread_cond_wait$NOCANCEL$UNIX2003
// darwin: pthread_cond_wait$UNIX2003
// Solaris: cond_wait (pthread_cond_wait is built atop of cond_wait)
+// FreeBSD: pthread_cond_wait
//
__attribute__((noinline))
static int pthread_cond_wait_WRK(pthread_cond_t* cond,
pthread_cond_t* cond, pthread_mutex_t* mutex) {
return pthread_cond_wait_WRK(cond, mutex);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZuwait, // pthread_cond_wait
+ pthread_cond_t* cond, pthread_mutex_t* mutex) {
+ return pthread_cond_wait_WRK(cond, mutex);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZuwaitZa, // pthread_cond_wait*
pthread_cond_t* cond, pthread_mutex_t* mutex) {
// darwin: pthread_cond_timedwait_relative_np (trapped)
// Solaris: cond_timedwait (pthread_cond_timedwait is built on cond_timedwait)
// Solaris: cond_reltimedwait (pthread_cond_reltimedwait_np is built on this)
+// FreeBSD: pthread_cond_timedwait
//
__attribute__((noinline))
static int pthread_cond_timedwait_WRK(pthread_cond_t* cond,
struct timespec* abstime) {
return pthread_cond_timedwait_WRK(cond, mutex, abstime, ETIMEDOUT);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZutimedwait, // pthread_cond_timedwait
+ pthread_cond_t* cond, pthread_mutex_t* mutex,
+ struct timespec* abstime) {
+ return pthread_cond_timedwait_WRK(cond, mutex, abstime, ETIMEDOUT);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZutimedwait, // pthread_cond_timedwait
pthread_cond_t* cond, pthread_mutex_t* mutex,
// darwin: pthread_cond_signal
// darwin: pthread_cond_signal_thread_np (don't intercept this)
// Solaris: cond_signal (pthread_cond_signal is a weak alias)
+// FreeBSD: pthread_cond_signal
//
__attribute__((noinline))
static int pthread_cond_signal_WRK(pthread_cond_t* cond)
pthread_cond_t* cond) {
return pthread_cond_signal_WRK(cond);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZusignal, // pthread_cond_signal
+ pthread_cond_t* cond) {
+ return pthread_cond_signal_WRK(cond);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZusignal, // pthread_cond_signal
pthread_cond_t* cond) {
// glibc: pthread_cond_broadcast@@GLIBC_2.3.2
// darwin: pthread_cond_broadcast
// Solaris: cond_broadcast (pthread_cond_broadcast is a weak alias)
+// FreeBSD: pthread_cond_broadcast
//
// Note, this is pretty much identical, from a dependency-graph
// point of view, with cond_signal, so the code is duplicated.
pthread_cond_t* cond) {
return pthread_cond_broadcast_WRK(cond);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZubroadcast, // pthread_cond_broadcast
+ pthread_cond_t* cond) {
+ return pthread_cond_broadcast_WRK(cond);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZubroadcast, // pthread_cond_broadcast
pthread_cond_t* cond) {
// glibc: pthread_cond_init@@GLIBC_2.3.2
// darwin: pthread_cond_init
// Solaris: cond_init (pthread_cond_init is built atop on this function)
+// FreeBSD: pthread_cond_init
// Easy way out: Handling of attr could have been messier.
// It turns out that pthread_cond_init under linux ignores
// all information in cond_attr, so do we.
pthread_cond_t* cond, pthread_condattr_t* cond_attr) {
return pthread_cond_init_WRK(cond, cond_attr);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZuinit, // pthread_cond_init@*
+ pthread_cond_t* cond, pthread_condattr_t* cond_attr) {
+ return pthread_cond_init_WRK(cond, cond_attr);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZuinit, // pthread_cond_init
pthread_cond_t* cond, pthread_condattr_t * cond_attr) {
// glibc: pthread_cond_destroy@GLIBC_2.0
// darwin: pthread_cond_destroy
// Solaris: cond_destroy (pthread_cond_destroy is a weak alias)
+// FreeBSD: pthread_cond_destroy
//
__attribute__((noinline))
static int pthread_cond_destroy_WRK(pthread_cond_t* cond)
pthread_cond_t* cond) {
return pthread_cond_destroy_WRK(cond);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZucondZudestroy, // pthread_cond_destroy@*
+ pthread_cond_t* cond) {
+ return pthread_cond_destroy_WRK(cond);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZucondZudestroy, // pthread_cond_destroy
pthread_cond_t* cond) {
// glibc: pthread_barrier_init
// darwin: (doesn't appear to exist)
// Solaris: pthread_barrier_init
+// FreeBSD: pthread_barrier_init
PTH_FUNC(int, pthreadZubarrierZuinit, // pthread_barrier_init
pthread_barrier_t* bar,
pthread_barrierattr_t* attr, unsigned long count)
// glibc: pthread_barrier_wait
// darwin: (doesn't appear to exist)
// Solaris: pthread_barrier_wait
+// FreeBSD: pthread_barrier_wait
PTH_FUNC(int, pthreadZubarrierZuwait, // pthread_barrier_wait
pthread_barrier_t* bar)
{
// glibc: pthread_barrier_destroy
// darwin: (doesn't appear to exist)
// Solaris: pthread_barrier_destroy
+// FreeBSD: pthread_barrier_destroy
PTH_FUNC(int, pthreadZubarrierZudestroy, // pthread_barrier_destroy
pthread_barrier_t* bar)
{
// darwin: (doesn't appear to exist)
// Solaris: pthread_spin_init
// Solaris: pthread_spin_unlock
+// FreeBSD: pthread_spin_init
+// FreeBSD: pthread_spin_unlock
__attribute__((noinline))
static int pthread_spin_init_or_unlock_WRK(pthread_spinlock_t* lock,
int pshared) {
/* this is never actually called */
return pthread_spin_init_or_unlock_WRK(lock, 0/*pshared*/);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZuspinZuinit, // pthread_spin_init
+ pthread_spinlock_t* lock, int pshared) {
+ return pthread_spin_init_or_unlock_WRK(lock, pshared);
+ }
+ PTH_FUNC(int, pthreadZuspinZuunlock, // pthread_spin_unlock@*
+ pthread_spinlock_t* lock) {
+ /* this is never actually called */
+ return pthread_spin_init_or_unlock_WRK(lock, 0/*pshared*/);
+ }
#elif defined(VGO_darwin)
#elif defined(VGO_solaris)
PTH_FUNC(int, pthreadZuspinZuinit, // pthread_spin_init
// glibc: pthread_spin_destroy
// darwin: (doesn't appear to exist)
// Solaris: pthread_spin_destroy
+// FreeBSD: pthread_spin_destroy
__attribute__((noinline))
static int pthread_spin_destroy_WRK(pthread_spinlock_t *lock)
{
}
return ret;
}
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZuspinZudestroy, // pthread_spin_destroy
pthread_spinlock_t *lock) {
return pthread_spin_destroy_WRK(lock);
// glibc: pthread_spin_lock
// darwin: (doesn't appear to exist)
// Solaris: pthread_spin_lock
+// FreeBSD: pthread_spin_lock
__attribute__((noinline))
static int pthread_spin_lock_WRK(pthread_spinlock_t *lock)
{
}
return ret;
}
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZuspinZulock, // pthread_spin_lock
pthread_spinlock_t *lock) {
return pthread_spin_lock_WRK(lock);
// glibc: pthread_spin_trylock
// darwin: (doesn't appear to exist)
// Solaris: pthread_spin_trylock
+// FreeBSD: pthread_spin_trylock
__attribute__((noinline))
static int pthread_spin_trylock_WRK(pthread_spinlock_t *lock)
{
}
return ret;
}
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_freebsd)
PTH_FUNC(int, pthreadZuspinZutrylock, // pthread_spin_trylock
pthread_spinlock_t *lock) {
return pthread_spin_trylock_WRK(lock);
// darwin: pthread_rwlock_init
// darwin: pthread_rwlock_init$UNIX2003
// Solaris: rwlock_init (pthread_rwlock_init is built atop of rwlock_init)
+// FreeBSD: pthread_rwlock_init
__attribute__((noinline))
static int pthread_rwlock_init_WRK(pthread_rwlock_t *rwl,
pthread_rwlockattr_t* attr)
pthread_rwlockattr_t* attr) {
return pthread_rwlock_init_WRK(rwl, attr);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZuinit, // pthread_rwlock_init
+ pthread_rwlock_t *rwl,
+ pthread_rwlockattr_t* attr) {
+ return pthread_rwlock_init_WRK(rwl, attr);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZuinitZa, // pthread_rwlock_init*
pthread_rwlock_t *rwl,
// darwin: pthread_rwlock_destroy
// darwin: pthread_rwlock_destroy$UNIX2003
// Solaris: rwlock_destroy (pthread_rwlock_destroy is a weak alias)
+// FreeBSD: pthread_rwlock_destroy
//
__attribute__((noinline))
static int pthread_rwlock_destroy_WRK(pthread_rwlock_t* rwl)
pthread_rwlock_t *rwl) {
return pthread_rwlock_destroy_WRK(rwl);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZudestroy, // pthread_rwlock_destroy
+ pthread_rwlock_t *rwl) {
+ return pthread_rwlock_destroy_WRK(rwl);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZudestroyZa, // pthread_rwlock_destroy*
pthread_rwlock_t *rwl) {
// darwin: pthread_rwlock_wrlock
// darwin: pthread_rwlock_wrlock$UNIX2003
// Solaris: rw_wrlock (pthread_rwlock_wrlock is a weak alias)
+// FreeBSD: pthread_rwlock_wrlock
//
__attribute__((noinline))
static int pthread_rwlock_wrlock_WRK(pthread_rwlock_t* rwlock)
pthread_rwlock_t* rwlock) {
return pthread_rwlock_wrlock_WRK(rwlock);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZuwrlock, // pthread_rwlock_wrlock
+ pthread_rwlock_t* rwlock) {
+ return pthread_rwlock_wrlock_WRK(rwlock);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZuwrlockZa, // pthread_rwlock_wrlock*
pthread_rwlock_t* rwlock) {
// darwin: pthread_rwlock_rdlock
// darwin: pthread_rwlock_rdlock$UNIX2003
// Solaris: rw_rdlock (pthread_rwlock_rdlock is a weak alias)
+// FreeBSD: pthread_rwlock_rdlock
//
__attribute__((noinline))
static int pthread_rwlock_rdlock_WRK(pthread_rwlock_t* rwlock)
pthread_rwlock_t* rwlock) {
return pthread_rwlock_rdlock_WRK(rwlock);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZurdlock, // pthread_rwlock_rdlock
+ pthread_rwlock_t* rwlock) {
+ return pthread_rwlock_rdlock_WRK(rwlock);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZurdlockZa, // pthread_rwlock_rdlock*
pthread_rwlock_t* rwlock) {
// darwin: pthread_rwlock_trywrlock
// darwin: pthread_rwlock_trywrlock$UNIX2003
// Solaris: rw_trywrlock (pthread_rwlock_trywrlock is a weak alias)
+// FreeBSD: pthread_rwlock_trywrlock
//
__attribute__((noinline))
static int pthread_rwlock_trywrlock_WRK(pthread_rwlock_t* rwlock)
pthread_rwlock_t* rwlock) {
return pthread_rwlock_trywrlock_WRK(rwlock);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZutrywrlock, // pthread_rwlock_trywrlock
+ pthread_rwlock_t* rwlock) {
+ return pthread_rwlock_trywrlock_WRK(rwlock);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZutrywrlockZa, // pthread_rwlock_trywrlock*
pthread_rwlock_t* rwlock) {
// darwin: pthread_rwlock_tryrdlock
// darwin: pthread_rwlock_tryrdlock$UNIX2003
// Solaris: rw_tryrdlock (pthread_rwlock_tryrdlock is a weak alias)
+// FreeBSD: pthread_rwlock_tryrdlock
//
__attribute__((noinline))
static int pthread_rwlock_tryrdlock_WRK(pthread_rwlock_t* rwlock)
pthread_rwlock_t* rwlock) {
return pthread_rwlock_tryrdlock_WRK(rwlock);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZutryrdlock, // pthread_rwlock_tryrdlock
+ pthread_rwlock_t* rwlock) {
+ return pthread_rwlock_tryrdlock_WRK(rwlock);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZutryrdlockZa, // pthread_rwlock_tryrdlock*
pthread_rwlock_t* rwlock) {
// darwin: Unhandled
// Solaris: pthread_rwlock_timedrdlock
// Solaris: pthread_rwlock_reltimedrdlock_np
+// FreeBSD: pthread_rwlock_timedrdlock
//
__attribute__((noinline)) __attribute__((unused))
static int pthread_rwlock_timedrdlock_WRK(pthread_rwlock_t *rwlock,
}
#if defined(VGO_linux)
#elif defined(VGO_darwin)
+#elif defined(VGO_freebsd)
+PTH_FUNC(int, pthreadZurwlockZutimedrdlock, // pthread_rwlock_timedrdlock
+ pthread_rwlock_t *rwlock,
+ const struct timespec *timeout) {
+ return pthread_rwlock_timedrdlock_WRK(rwlock, timeout);
+}
#elif defined(VGO_solaris)
PTH_FUNC(int, pthreadZurwlockZutimedrdlock, // pthread_rwlock_timedrdlock
pthread_rwlock_t *rwlock,
// darwin: Unhandled
// Solaris: pthread_rwlock_timedwrlock
// Solaris: pthread_rwlock_reltimedwrlock_np
+// FreeBSD: pthread_rwlock_timedwrlock
//
__attribute__((noinline)) __attribute__((unused))
static int pthread_rwlock_timedwrlock_WRK(pthread_rwlock_t *rwlock,
}
#if defined(VGO_linux)
#elif defined(VGO_darwin)
+#elif defined(VGO_freebsd)
+PTH_FUNC(int, pthreadZurwlockZutimedwrlock, // pthread_rwlock_timedwrlock
+ pthread_rwlock_t *rwlock,
+ const struct timespec *timeout) {
+ return pthread_rwlock_timedwrlock_WRK(rwlock, timeout);
+}
#elif defined(VGO_solaris)
PTH_FUNC(int, pthreadZurwlockZutimedwrlock, // pthread_rwlock_timedwrlock
pthread_rwlock_t *rwlock,
// darwin: pthread_rwlock_unlock
// darwin: pthread_rwlock_unlock$UNIX2003
// Solaris: rw_unlock (pthread_rwlock_unlock is a weak alias)
+// FreeBSD: pthread_rwlock_unlock
__attribute__((noinline))
static int pthread_rwlock_unlock_WRK(pthread_rwlock_t* rwlock)
{
pthread_rwlock_t* rwlock) {
return pthread_rwlock_unlock_WRK(rwlock);
}
+#elif defined(VGO_freebsd)
+ PTH_FUNC(int, pthreadZurwlockZuunlock, // pthread_rwlock_unlock
+ pthread_rwlock_t* rwlock) {
+ return pthread_rwlock_unlock_WRK(rwlock);
+ }
#elif defined(VGO_darwin)
PTH_FUNC(int, pthreadZurwlockZuunlockZa, // pthread_rwlock_unlock*
pthread_rwlock_t* rwlock) {
// glibc: sem_init@GLIBC_2.0
// darwin: sem_init
// Solaris: sema_init (sem_init is built on top of sem_init)
+// FreeBSD: sem_init (libc)
//
#if !defined(VGO_solaris)
__attribute__((noinline))
sem_t* sem, int pshared, unsigned long value) {
return sem_init_WRK(sem, pshared, value);
}
-#else
+#elif defined(VGO_freebsd)
+ LIBC_FUNC(int, semZuinit, // sem_init
+ sem_t* sem, int pshared, unsigned long value) {
+ return sem_init_WRK(sem, pshared, value);
+ }
+ #else
# error "Unsupported OS"
#endif
// glibc: sem_destroy@@GLIBC_2.2.5
// darwin: sem_destroy
// Solaris: sema_destroy (sem_destroy is built on top of sema_destroy)
+// FreeBSD: sem_destroy (libc)
__attribute__((noinline))
static int sem_destroy_WRK(sem_t* sem)
{
sem_t* sem) {
return sem_destroy_WRK(sem);
}
+#elif defined(VGO_freebsd)
+ LIBC_FUNC(int, semZudestroy, // sem_destroy
+ sem_t* sem) {
+ return sem_destroy_WRK(sem);
+ }
#elif defined(VGO_solaris)
PTH_FUNC(int, semaZudestroy, // sema_destroy
sem_t *sem) {
// darwin: sem_wait$NOCANCEL$UNIX2003
// darwin: sem_wait$UNIX2003
// Solaris: sema_wait (sem_wait is built on top of sema_wait)
+// FreeBSD: sem_wait (libc)
//
/* wait: decrement semaphore - acquire lockage */
__attribute__((noinline))
PTH_FUNC(int, semZuwaitZDZa, sem_t* sem) { /* sem_wait$* */
return sem_wait_WRK(sem);
}
+#elif defined(VGO_freebsd)
+ LIBC_FUNC(int, semZuwait, sem_t* sem) { /* sem_wait */
+ return sem_wait_WRK(sem);
+ }
#elif defined(VGO_solaris)
PTH_FUNC(int, semaZuwait, sem_t *sem) { /* sema_wait */
return sem_wait_WRK(sem);
// glibc: sem_post@@GLIBC_2.1
// darwin: sem_post
// Solaris: sema_post (sem_post is built on top of sema_post)
+// FreeBSD: sem_post (libc)
//
/* post: increment semaphore - release lockage */
__attribute__((noinline))
PTH_FUNC(int, semZupost, sem_t* sem) { /* sem_post */
return sem_post_WRK(sem);
}
+#elif defined(VGO_freebsd)
+ LIBC_FUNC(int, semZupost, sem_t* sem) { /* sem_post */
+ return sem_post_WRK(sem);
+ }
#elif defined(VGO_solaris)
PTH_FUNC(int, semaZupost, sem_t *sem) { /* sema_post */
return sem_post_WRK(sem);
// glibc: sem_open
// darwin: sem_open
// Solaris: sem_open
+// FreeBSD: sem_open
//
+#if defined(VGO_freebsd)
+LIBC_FUNC(sem_t*, semZuopen,
+ const char* name, long oflag,
+ long mode, unsigned long value)
+#else
PTH_FUNC(sem_t*, semZuopen,
const char* name, long oflag,
long mode, unsigned long value)
+#endif
{
/* A copy of sem_init_WRK (more or less). Is this correct? */
OrigFn fn;
// glibc: sem_close
// darwin: sem_close
// Solaris: sem_close
+// FreeBSD: sem_close
+#if defined (VGO_freebsd)
+LIBC_FUNC(int, sem_close, sem_t* sem)
+#else
PTH_FUNC(int, sem_close, sem_t* sem)
+#endif
{
OrigFn fn;
int ret;