1/*****************************************************************************/ 2// Copyright 2002-2008 Adobe Systems Incorporated 3// All Rights Reserved. 4// 5// NOTICE: Adobe permits you to use, modify, and distribute this file in 6// accordance with the terms of the Adobe license agreement accompanying it. 7/*****************************************************************************/ 8 9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_pthread.h#1 $ */ 10/* $DateTime: 2012/05/30 13:28:51 $ */ 11/* $Change: 832332 $ */ 12/* $Author: tknoll $ */ 13 14/*****************************************************************************/ 15 16#ifndef __dng_pthread__ 17#define __dng_pthread__ 18 19/*****************************************************************************/ 20 21#include "dng_flags.h" 22 23/*****************************************************************************/ 24 25#if qDNGThreadSafe 26 27/*****************************************************************************/ 28 29#if !qWinOS 30 31/*****************************************************************************/ 32 33/* Try generic POSIX compile */ 34 35#include <errno.h> 36#include <pthread.h> 37 38#define dng_pthread_disassociate() 39#define dng_pthread_terminate() 40 41/*****************************************************************************/ 42 43#else 44 45/*****************************************************************************/ 46 47#include <stdlib.h> 48 49#if _MSC_VER >= 1600 50 51// Get this included so ETIMEDOUT is predefined. 52#include <errno.h> 53 54#endif 55 56// Use the standard "timespec" struct as "dng_timespec" for VS2015 and above 57// from <time.h>. Define "dng_timespec" as "timespec" otherwise. 58#if _MSC_VER >= 1900 59#include <time.h> 60#define dng_timespec timespec 61#else 62struct dng_timespec { 63 long tv_sec; 64 long tv_nsec; 65}; 66#define timespec dng_timespec 67#endif 68 69#ifdef __cplusplus 70extern "C" 71{ 72#endif 73 74/*****************************************************************************/ 75 76#define DNG_ETIMEDOUT 60 /* Operation timed out */ 77 78typedef unsigned long dng_pthread_t; 79 80typedef struct dng_pthread_mutex_impl *dng_pthread_mutex_t; 81typedef struct dng_pthread_cond_impl *dng_pthread_cond_t; 82typedef unsigned long dng_pthread_key_t; 83 84 85#define DNG_PTHREAD_MUTEX_INITIALIZER ((struct dng_pthread_mutex_impl *)-1) 86#define DNG_PTHREAD_COND_INITIALIZER ((struct dng_pthread_cond_impl *)-1) 87 88struct _dng_pthread_once_t { 89 int inited; 90 long semaphore; 91}; 92 93typedef struct _dng_pthread_once_t dng_pthread_once_t; 94#define DNG_PTHREAD_ONCE_INIT { 0, -1 } 95 96#define dng_pthread_equal(t1, t2) ((t1) == (t2)) 97 98typedef struct dng_pthread_attr_impl *dng_pthread_attr_t; 99 100int dng_pthread_attr_init(dng_pthread_attr_t *attr); 101int dng_pthread_attr_destroy(dng_pthread_attr_t *attr); 102 103int dng_pthread_attr_setstacksize(dng_pthread_attr_t *attr, size_t stacksize); 104int dng_pthread_attr_getstacksize(const dng_pthread_attr_t *attr, size_t *stacksize); 105 106int dng_pthread_create(dng_pthread_t *thread, const dng_pthread_attr_t * /* attrs */, void * (*func)(void *), void *arg); 107int dng_pthread_detach(dng_pthread_t thread); 108int dng_pthread_join(dng_pthread_t thread, void **result); 109dng_pthread_t dng_pthread_self(); 110void dng_pthread_exit(void *result); 111 112#define DNG_PTHREAD_MUTEX_RECURSIVE 0 113typedef unsigned long dng_pthread_mutexattr_t; 114 115int dng_pthread_mutexattr_init(dng_pthread_mutexattr_t *mutexattr); 116int dng_pthread_mutexattr_settype(dng_pthread_mutexattr_t *mutexattr, int /*the options*/); 117 118int dng_pthread_mutex_init(dng_pthread_mutex_t *mutex, void * /* attrs */); 119int dng_pthread_mutex_destroy(dng_pthread_mutex_t *mutex); 120int dng_pthread_mutex_lock(dng_pthread_mutex_t *mutex); 121int dng_pthread_mutex_unlock(dng_pthread_mutex_t *mutex); 122 123int dng_pthread_cond_init(dng_pthread_cond_t *cond, void * /* attrs */); 124int dng_pthread_cond_destroy(dng_pthread_cond_t *cond); 125int dng_pthread_cond_wait(dng_pthread_cond_t *cond, dng_pthread_mutex_t *mutex); 126int dng_pthread_cond_timedwait(dng_pthread_cond_t *cond, dng_pthread_mutex_t *mutex, struct dng_timespec *latest_time); 127int dng_pthread_cond_signal(dng_pthread_cond_t *cond); 128int dng_pthread_cond_broadcast(dng_pthread_cond_t *cond); 129 130int dng_pthread_once(dng_pthread_once_t *once, void (*init_func)()); 131 132int dng_pthread_key_create(dng_pthread_key_t * key, void (*destructor) (void *)); 133int dng_pthread_key_delete(dng_pthread_key_t key); 134int dng_pthread_setspecific(dng_pthread_key_t key, const void *value); 135void *dng_pthread_getspecific(dng_pthread_key_t key); 136 137typedef struct dng_pthread_rwlock_impl *dng_pthread_rwlock_t; 138typedef void *pthread_rwlockattr_t; 139 140int dng_pthread_rwlock_destroy(dng_pthread_rwlock_t * rwlock); 141int dng_pthread_rwlock_init(dng_pthread_rwlock_t * rwlock, const pthread_rwlockattr_t * attrs); 142int dng_pthread_rwlock_rdlock(dng_pthread_rwlock_t * rwlock); 143int dng_pthread_rwlock_tryrdlock(dng_pthread_rwlock_t * rwlock); 144int dng_pthread_rwlock_trywrlock(dng_pthread_rwlock_t * rwlock); 145int dng_pthread_rwlock_unlock(dng_pthread_rwlock_t * rwlock); 146int dng_pthread_rwlock_wrlock(dng_pthread_rwlock_t * rwlock); 147 148typedef struct dng_pthread_rwlock_impl *dng_pthread_rwlock_t; 149typedef void *pthread_rwlockattr_t; 150 151int dng_pthread_rwlock_destroy(dng_pthread_rwlock_t * rwlock); 152int dng_pthread_rwlock_init(dng_pthread_rwlock_t * rwlock, const pthread_rwlockattr_t * attrs); 153int dng_pthread_rwlock_rdlock(dng_pthread_rwlock_t * rwlock); 154int dng_pthread_rwlock_tryrdlock(dng_pthread_rwlock_t * rwlock); 155int dng_pthread_rwlock_trywrlock(dng_pthread_rwlock_t * rwlock); 156int dng_pthread_rwlock_unlock(dng_pthread_rwlock_t * rwlock); 157int dng_pthread_rwlock_wrlock(dng_pthread_rwlock_t * rwlock); 158 159// dng_pthread may maintain per-thread global state. This routine frees that global state. 160// there is no need to call this for threads created by dng_pthread and one can call 161// dng_pthread routines of a thread after dng_pthread_disassociate as the global state will 162// be recreated as necessary. However dng_pthread_disassociate will need to be called again 163// and there is a slight performance cost. Do not call this routine while holding a mutex, etc. 164void dng_pthread_disassociate(); 165 166void dng_pthread_terminate(); 167 168/*****************************************************************************/ 169 170// Map symbols back to plain pthread names. This whole mechanism is so the DNG pthreads library 171// symbols do not collide with another pthread emulation library 172// that may be in use in the same linked entity. However if that is the case, it would be far better 173// to have the DNG code use the same pthread library as the rest of the code. 174 175#define pthread_t dng_pthread_t 176#define pthread_mutex_t dng_pthread_mutex_t 177#define pthread_cond_t dng_pthread_cond_t 178#define pthread_once_t dng_pthread_once_t 179#define pthread_key_t dng_pthread_key_t 180 181#undef PTHREAD_MUTEX_INITIALIZER 182#define PTHREAD_MUTEX_INITIALIZER DNG_PTHREAD_MUTEX_INITIALIZER 183#undef PTHREAD_COND_INITIALIZER 184#define PTHREAD_COND_INITIALIZER DNG_PTHREAD_COND_INITIALIZER 185 186#undef PTHREAD_ONCE_INIT 187#define PTHREAD_ONCE_INIT DNG_PTHREAD_ONCE_INIT 188 189/* If it is defined on Windows, it probably has the wrong value... */ 190#if defined(WIN32) || !defined(ETIMEDOUT) 191#undef ETIMEDOUT 192#define ETIMEDOUT DNG_ETIMEDOUT 193#endif 194 195#define pthread_equal dng_pthread_equal 196 197#define pthread_attr_t dng_pthread_attr_t 198 199#define pthread_attr_init dng_pthread_attr_init 200#define pthread_attr_destroy dng_pthread_attr_destroy 201 202#define pthread_attr_setstacksize dng_pthread_attr_setstacksize 203#define pthread_attr_getstacksize dng_pthread_attr_getstacksize 204 205#define pthread_create dng_pthread_create 206#define pthread_detach dng_pthread_detach 207#define pthread_join dng_pthread_join 208#define pthread_self dng_pthread_self 209#define pthread_exit dng_pthread_exit 210 211#define pthread_mutex_init dng_pthread_mutex_init 212#define pthread_mutex_destroy dng_pthread_mutex_destroy 213#define pthread_mutex_lock dng_pthread_mutex_lock 214#define pthread_mutex_unlock dng_pthread_mutex_unlock 215 216#define pthread_cond_init dng_pthread_cond_init 217#define pthread_cond_destroy dng_pthread_cond_destroy 218#define pthread_cond_wait dng_pthread_cond_wait 219#define pthread_cond_timedwait dng_pthread_cond_timedwait 220#define pthread_cond_signal dng_pthread_cond_signal 221#define pthread_cond_broadcast dng_pthread_cond_broadcast 222 223#define pthread_once dng_pthread_once 224 225#define pthread_key_create dng_pthread_key_create 226#define pthread_key_delete dng_pthread_key_delete 227#define pthread_setspecific dng_pthread_setspecific 228#define pthread_getspecific dng_pthread_getspecific 229 230#define pthread_rwlock_t dng_pthread_rwlock_t 231 232#define pthread_rwlock_destroy dng_pthread_rwlock_destroy 233#define pthread_rwlock_init dng_pthread_rwlock_init 234#define pthread_rwlock_rdlock dng_pthread_rwlock_rdlock 235#define pthread_rwlock_tryrdlock dng_pthread_rwlock_tryrdlock 236#define pthread_rwlock_trywrlock dng_pthread_rwlock_trywrlock 237#define pthread_rwlock_unlock dng_pthread_rwlock_unlock 238#define pthread_rwlock_wrlock dng_pthread_rwlock_wrlock 239 240/*****************************************************************************/ 241 242#ifdef __cplusplus 243} 244#endif 245 246/*****************************************************************************/ 247 248#endif 249 250/*****************************************************************************/ 251 252#ifdef __cplusplus 253extern "C" 254{ 255#endif 256 257int dng_pthread_now (struct timespec *now); 258 259#ifdef __cplusplus 260} 261#endif 262 263/*****************************************************************************/ 264 265#endif // qDNGThreadSafe 266 267/*****************************************************************************/ 268 269#endif 270 271/*****************************************************************************/ 272