pthread_rdwr.h

Go to the documentation of this file.
00001 /* 
00002  * Copyright (C) 2005 Abel Bennett.
00003  *
00004  * This is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with the GNU C Library; if not, write to the Free
00016  * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00017  * 02111-1307 USA.
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

Generated on Tue Apr 24 20:01:36 2007 for libctf by  doxygen 1.5.1