29#ifndef DT_SYSTEM_DTPTHREAD_H
30#define DT_SYSTEM_DTPTHREAD_H
32#include "external/ThreadSafetyAnalysis.h"
69typedef struct CAPABILITY(
"mutex") dt_pthread_mutex_t
171typedef struct CAPABILITY(
"rwlock") dt_pthread_rwlock_t
173 pthread_rwlock_t
lock;
195 lock->writer_depth = 0;
197 lock->last_holder_tid = 0;
199 lock->active_reader_count = 0;
200 lock->oldest_active_reader_since = 0.0;
201 lock->oldest_active_reader_tid = 0;
231 rwlock->oldest_active_reader_since = 0.0;
232 rwlock->oldest_active_reader_tid = 0;
264 return ts.tv_sec + ts.tv_nsec / 1
e9;
360#define dt_pthread_rwlock_rdlock_with_caller(A,B,C) dt_pthread_rwlock_rdlock(A)
361#define dt_pthread_rwlock_wrlock_with_caller(A,B,C) dt_pthread_rwlock_wrlock(A)
362#define dt_pthread_rwlock_tryrdlock_with_caller(A,B,C) dt_pthread_rwlock_tryrdlock(A)
363#define dt_pthread_rwlock_trywrlock_with_caller(A,B,C) dt_pthread_rwlock_trywrlock(A)
static int rwlock NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_BAD_lock(dt_pthread_mutex_t *mutex)
int dt_pthread_create(pthread_t *thread, void *(*start_routine)(void *), void *arg, const gboolean realtime)
struct CAPABILITY("mutex") dt_pthread_mutex_t
void _dt_pthread_rwlock_diag_log_rdlock(const char *name, unsigned long tid, double wait_ms, unsigned long prev_holder, gboolean prev_was_writer)
static int dt_pthread_rwlock_wrlock(dt_pthread_rwlock_t *rwlock) ACQUIRE(rwlock) NO_THREAD_SAFETY_ANALYSIS
return pthread_rwlock_tryrdlock & rwlock
static int dt_pthread_rwlock_trywrlock(dt_pthread_rwlock_t *rwlock) TRY_ACQUIRE(0
static int dt_pthread_mutex_BAD_trylock(dt_pthread_mutex_t *mutex)
static double _dt_pthread_rwlock_diag_now(void)
static int dt_pthread_mutex_BAD_unlock(dt_pthread_mutex_t *mutex)
static void dt_pthread_rwlock_set_name(dt_pthread_rwlock_t *lock, const char *name)
static int dt_pthread_rwlock_unlock(dt_pthread_rwlock_t *rwlock) RELEASE_GENERIC(rwlock) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_rwlock_rdlock(dt_pthread_rwlock_t *rwlock) ACQUIRE_SHARED(rwlock) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
void _dt_pthread_rwlock_diag_log_wrlock(const char *name, unsigned long tid, double wait_ms, unsigned long prev_holder, gboolean prev_was_writer, int active_readers, unsigned long oldest_reader_tid, double oldest_reader_age_ms)
static int dt_pthread_rwlock_destroy(dt_pthread_rwlock_t *lock)
static int dt_pthread_rwlock_tryrdlock(dt_pthread_rwlock_t *rwlock) TRY_ACQUIRE_SHARED(0
static int dt_pthread_mutex_trylock(dt_pthread_mutex_t *mutex) TRY_ACQUIRE(0
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
void dt_pthread_setname(const char *name)
static int dt_pthread_rwlock_init(dt_pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr)
static int dt_pthread_cond_wait(pthread_cond_t *cond, dt_pthread_mutex_t *mutex)
Wait on cond, releasing mutex for the duration.
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS