00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00037 #ifndef _PTHREAD_RDRW_
00038 #define _PTHREAD_RDRW_
00039
00040
00041 #include <pthread.h>
00042 #include <unistd.h>
00043
00044
00045 #ifdef __cplusplus
00046 extern "C" {
00047 #endif
00048
00049
00053 enum
00054 {
00058 PTHREAD_RDWR_PREFER_READER,
00059
00063 PTHREAD_RDWR_PREFER_WRITER,
00064
00068 PTHREAD_RDWR_PREFER_TOGGLE,
00069
00073 PTHREAD_RDWR_PREFER_DEFAULT = PTHREAD_RDWR_PREFER_TOGGLE
00074 };
00075
00079 #define PTHREAD_RDWR_PREFER_READER PTHREAD_RDWR_PREFER_READER
00080
00084 #define PTHREAD_RDWR_PREFER_WRITER PTHREAD_RDWR_PREFER_WRITER
00085
00089 #define PTHREAD_RDWR_PREFER_TOGGLE PTHREAD_RDWR_PREFER_TOGGLE
00090
00094 #define PTHREAD_RDWR_PREFER_DEFAULT PTHREAD_RDWR_PREFER_DEFAULT
00095
00099 enum
00100 {
00104 PTHREAD_RDWR_NORMAL,
00105
00109 PTHREAD_RDWR_ERRORCHECK,
00110
00114 PTHREAD_RDWR_DEFAULT = PTHREAD_RDWR_NORMAL
00115 };
00116
00120 #define PTHREAD_RDWR_NORMAL PTHREAD_RDWR_NORMAL
00121
00125 #define PTHREAD_RDWR_ERRORCHECK PTHREAD_RDWR_ERRORCHECK
00126
00130 #define PTHREAD_RDWR_DEFAULT PTHREAD_RDWR_DEFAULT
00131
00135 typedef struct
00136 {
00140 pthread_mutexattr_t mutex_attr;
00141
00145 pthread_condattr_t cond_attr;
00146
00150 int pshared;
00151
00155 int preference;
00156
00160 int type;
00161
00162 } pthread_rdwrattr_t;
00163
00164
00168 typedef struct
00169 {
00173 pthread_mutex_t lock;
00174
00178 pthread_cond_t read_cond;
00179
00183 pthread_cond_t write_cond;
00184
00188 int reading;
00189
00193 int readers_waiting;
00194
00198 int writing;
00199
00203 int writers_waiting;
00204
00214 short stage;
00215
00219 int preference;
00220
00224 int type;
00225
00226 #ifdef CTF_STATS
00227
00230 int total_read_pass_count;
00231
00235 int total_read_wait_count;
00236
00240 int total_write_pass_count;
00241
00245 int total_write_wait_count;
00246
00250 float total_read_wait;
00251
00255 float total_write;
00256
00260 float total_write_wait;
00261 #endif
00262
00263 } pthread_rdwr_t;
00264
00265
00269 #ifdef CTF_STATS
00270 #define PTHREAD_RDWR_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, \
00271 PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, \
00272 0, 0, 0, 0, 0, PTHREAD_RDWR_PREFER_DEFAULT, PTHREAD_RDWR_DEFAULT, \
00273 0, 0, 0, 0, 0.0, 0.0, 0.0 }
00274 #else
00275 #define PTHREAD_RDWR_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, \
00276 PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, \
00277 0, 0, 0, 0, 0, PTHREAD_RDWR_PREFER_DEFAULT, PTHREAD_RDWR_DEFAULT }
00278 #endif
00279
00280
00289 extern int pthread_rdwr_init(pthread_rdwr_t * rdwr,
00290 const pthread_rdwrattr_t * attr);
00291
00299 extern int pthread_rdwr_destroy(pthread_rdwr_t * rdwr);
00300
00308 extern int pthread_rdwr_rdlock(pthread_rdwr_t * rdwr);
00309
00318 extern int pthread_rdwr_timedrdlock(pthread_rdwr_t * rdwr,
00319 const struct timespec * timeout);
00320
00328 extern int pthread_rdwr_tryrdlock(pthread_rdwr_t * rdwr);
00329
00337 extern int pthread_rdwr_wrlock(pthread_rdwr_t * rdwr);
00338
00347 extern int pthread_rdwr_timedwrlock(pthread_rdwr_t * rdwr,
00348 const struct timespec * timeout);
00349
00357 extern int pthread_rdwr_trywrlock(pthread_rdwr_t * rdwr);
00358
00366 extern int pthread_rdwr_unlock(pthread_rdwr_t * rdwr);
00367
00375 extern int pthread_rdwrattr_init(pthread_rdwrattr_t * attr);
00376
00384 extern int pthread_rdwrattr_destroy(pthread_rdwrattr_t * attr);
00385
00394 extern int pthread_rdwrattr_getkind(const pthread_rdwrattr_t * attr,
00395 int * pref);
00396
00405 extern int pthread_rdwrattr_setkind(pthread_rdwrattr_t * attr, const int pref);
00406
00415 extern int pthread_rdwrattr_gettype(const pthread_rdwrattr_t * attr,
00416 int * type);
00417
00426 extern int pthread_rdwrattr_settype(pthread_rdwrattr_t * attr, const int type);
00427
00428 #if (_POSIX_THREAD_PROCESS_SHARED == 1)
00429
00437 extern int pthread_rdwrattr_getpshared(const pthread_rdwrattr_t * attr,
00438 int * pshared);
00439
00448 extern int pthread_rdwrattr_setpshared(pthread_rdwrattr_t * attr,
00449 const int pshared);
00450 #endif
00451
00452 #ifdef __cplusplus
00453 }
00454 #endif
00455
00456 #endif