32 int pthread_rwlock_init(pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr);
33 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
34 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
35 int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
36 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
37 int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
38 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
40 int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(
void *),
void *arg)
44 if (thread == NULL || start_routine == NULL)
47 #pragma GCC diagnostic push
48 #pragma GCC diagnostic ignored "-Wcast-function-type"
49 *thread = (HANDLE) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);
50 #pragma GCC diagnostic pop
56 int pthread_join(pthread_t thread,
void **value_ptr)
59 WaitForSingleObject(thread, INFINITE);
64 int pthread_detach(pthread_t thread)
70 int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr)
77 InitializeCriticalSection(mutex);
81 int pthread_mutex_destroy(pthread_mutex_t *mutex)
85 DeleteCriticalSection(mutex);
89 int pthread_mutex_lock(pthread_mutex_t *mutex)
93 EnterCriticalSection(mutex);
97 int pthread_mutex_unlock(pthread_mutex_t *mutex)
101 LeaveCriticalSection(mutex);
105 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr)
110 InitializeConditionVariable(cond);
114 int pthread_cond_destroy(pthread_cond_t *cond)
121 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
123 if (cond == NULL || mutex == NULL)
125 return pthread_cond_timedwait(cond, mutex, NULL);
128 int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
129 const struct timespec *abstime)
131 if (cond == NULL || mutex == NULL)
133 if (!SleepConditionVariableCS(cond, mutex,
timespec_to_ms(abstime)))
138 int pthread_cond_signal(pthread_cond_t *cond)
142 WakeConditionVariable(cond);
146 int pthread_cond_broadcast(pthread_cond_t *cond)
150 WakeAllConditionVariable(cond);
154 int pthread_rwlock_init(pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr)
159 InitializeSRWLock(&(rwlock->lock));
160 rwlock->exclusive =
false;
164 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
170 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
174 AcquireSRWLockShared(&(rwlock->lock));
178 int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
182 return !TryAcquireSRWLockShared(&(rwlock->lock));
185 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
189 AcquireSRWLockExclusive(&(rwlock->lock));
190 rwlock->exclusive =
true;
194 int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
201 ret = TryAcquireSRWLockExclusive(&(rwlock->lock));
203 rwlock->exclusive =
true;
207 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
212 if (rwlock->exclusive) {
213 rwlock->exclusive =
false;
214 ReleaseSRWLockExclusive(&(rwlock->lock));
216 ReleaseSRWLockShared(&(rwlock->lock));
222 return (
int)SwitchToThread();
229 ts->tv_sec = (ms / 1000) + time(NULL);
230 ts->tv_nsec = (ms % 1000) * 1000000;
238 return ((abstime->tv_sec - time(NULL)) * 1000) + (abstime->tv_nsec / 1000000);
245 GetSystemInfo(&sysinfo);
246 return sysinfo.dwNumberOfProcessors;
254 return (
unsigned int)sysconf(_SC_NPROCESSORS_ONLN);