Lines Matching refs:rwlock
78 int pthread_rwlock_init(pthread_rwlock_t *rwlock, in pthread_rwlock_init() argument
81 if (!rwlock) in pthread_rwlock_init()
84 rwlock->attr = PTHREAD_PROCESS_PRIVATE; in pthread_rwlock_init()
85 pthread_mutex_init(&(rwlock->rw_mutex), NULL); in pthread_rwlock_init()
86 pthread_cond_init(&(rwlock->rw_condreaders), NULL); in pthread_rwlock_init()
87 pthread_cond_init(&(rwlock->rw_condwriters), NULL); in pthread_rwlock_init()
89 rwlock->rw_nwaitwriters = 0; in pthread_rwlock_init()
90 rwlock->rw_nwaitreaders = 0; in pthread_rwlock_init()
91 rwlock->rw_refcount = 0; in pthread_rwlock_init()
121 int pthread_rwlock_destroy (pthread_rwlock_t *rwlock) in pthread_rwlock_destroy() argument
125 if (!rwlock) in pthread_rwlock_destroy()
127 if (rwlock->attr == -1) in pthread_rwlock_destroy()
130 if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_destroy()
133 if (rwlock->rw_refcount != 0 || in pthread_rwlock_destroy()
134 rwlock->rw_nwaitreaders != 0 || in pthread_rwlock_destroy()
135 rwlock->rw_nwaitwriters != 0) in pthread_rwlock_destroy()
144 result = rt_sem_trytake(&(rwlock->rw_condreaders.sem)); in pthread_rwlock_destroy()
147 result = rt_sem_trytake(&(rwlock->rw_condwriters.sem)); in pthread_rwlock_destroy()
150 rt_sem_release(&(rwlock->rw_condreaders.sem)); in pthread_rwlock_destroy()
151 rt_sem_release(&(rwlock->rw_condwriters.sem)); in pthread_rwlock_destroy()
153 pthread_cond_destroy(&rwlock->rw_condreaders); in pthread_rwlock_destroy()
154 pthread_cond_destroy(&rwlock->rw_condwriters); in pthread_rwlock_destroy()
158 rt_sem_release(&(rwlock->rw_condreaders.sem)); in pthread_rwlock_destroy()
166 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_destroy()
168 pthread_mutex_destroy(&rwlock->rw_mutex); in pthread_rwlock_destroy()
197 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) in pthread_rwlock_rdlock() argument
201 if (!rwlock) in pthread_rwlock_rdlock()
203 if (rwlock->attr == -1) in pthread_rwlock_rdlock()
204 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_rdlock()
206 if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_rdlock()
210 while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0) in pthread_rwlock_rdlock()
212 rwlock->rw_nwaitreaders++; in pthread_rwlock_rdlock()
214 result = pthread_cond_wait(&rwlock->rw_condreaders, &rwlock->rw_mutex); in pthread_rwlock_rdlock()
216 rwlock->rw_nwaitreaders--; in pthread_rwlock_rdlock()
223 rwlock->rw_refcount++; in pthread_rwlock_rdlock()
225 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_rdlock()
253 int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) in pthread_rwlock_tryrdlock() argument
257 if (!rwlock) in pthread_rwlock_tryrdlock()
259 if (rwlock->attr == -1) in pthread_rwlock_tryrdlock()
260 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_tryrdlock()
262 if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_tryrdlock()
265 if (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0) in pthread_rwlock_tryrdlock()
268 rwlock->rw_refcount++; /* increment count of reader locks */ in pthread_rwlock_tryrdlock()
270 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_tryrdlock()
305 int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, in pthread_rwlock_timedrdlock() argument
310 if (!rwlock) in pthread_rwlock_timedrdlock()
312 if (rwlock->attr == -1) in pthread_rwlock_timedrdlock()
313 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_timedrdlock()
315 if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_timedrdlock()
319 while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0) in pthread_rwlock_timedrdlock()
321 rwlock->rw_nwaitreaders++; in pthread_rwlock_timedrdlock()
323 result = pthread_cond_timedwait(&rwlock->rw_condreaders, &rwlock->rw_mutex, abstime); in pthread_rwlock_timedrdlock()
325 rwlock->rw_nwaitreaders--; in pthread_rwlock_timedrdlock()
332 rwlock->rw_refcount++; in pthread_rwlock_timedrdlock()
334 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_timedrdlock()
369 int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, in pthread_rwlock_timedwrlock() argument
374 if (!rwlock) in pthread_rwlock_timedwrlock()
376 if (rwlock->attr == -1) in pthread_rwlock_timedwrlock()
377 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_timedwrlock()
379 if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_timedwrlock()
382 while (rwlock->rw_refcount != 0) in pthread_rwlock_timedwrlock()
384 rwlock->rw_nwaitwriters++; in pthread_rwlock_timedwrlock()
386 result = pthread_cond_timedwait(&rwlock->rw_condwriters, &rwlock->rw_mutex, abstime); in pthread_rwlock_timedwrlock()
388 rwlock->rw_nwaitwriters--; in pthread_rwlock_timedwrlock()
395 rwlock->rw_refcount = -1; in pthread_rwlock_timedwrlock()
397 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_timedwrlock()
426 int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) in pthread_rwlock_trywrlock() argument
430 if (!rwlock) in pthread_rwlock_trywrlock()
432 if (rwlock->attr == -1) in pthread_rwlock_trywrlock()
433 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_trywrlock()
435 if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_trywrlock()
438 if (rwlock->rw_refcount != 0) in pthread_rwlock_trywrlock()
441 rwlock->rw_refcount = -1; /* available, indicate a writer has it */ in pthread_rwlock_trywrlock()
443 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_trywrlock()
471 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) in pthread_rwlock_unlock() argument
475 if (!rwlock) in pthread_rwlock_unlock()
477 if (rwlock->attr == -1) in pthread_rwlock_unlock()
478 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_unlock()
480 if ( (result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_unlock()
483 if (rwlock->rw_refcount > 0) in pthread_rwlock_unlock()
484 rwlock->rw_refcount--; /* releasing a reader */ in pthread_rwlock_unlock()
485 else if (rwlock->rw_refcount == -1) in pthread_rwlock_unlock()
486 rwlock->rw_refcount = 0; /* releasing a writer */ in pthread_rwlock_unlock()
489 if (rwlock->rw_nwaitwriters > 0) in pthread_rwlock_unlock()
491 if (rwlock->rw_refcount == 0) in pthread_rwlock_unlock()
492 result = pthread_cond_signal(&rwlock->rw_condwriters); in pthread_rwlock_unlock()
494 else if (rwlock->rw_nwaitreaders > 0) in pthread_rwlock_unlock()
496 result = pthread_cond_broadcast(&rwlock->rw_condreaders); in pthread_rwlock_unlock()
499 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_unlock()
530 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) in pthread_rwlock_wrlock() argument
534 if (!rwlock) in pthread_rwlock_wrlock()
536 if (rwlock->attr == -1) in pthread_rwlock_wrlock()
537 pthread_rwlock_init(rwlock, NULL); in pthread_rwlock_wrlock()
539 if ((result = pthread_mutex_lock(&rwlock->rw_mutex)) != 0) in pthread_rwlock_wrlock()
542 while (rwlock->rw_refcount != 0) in pthread_rwlock_wrlock()
544 rwlock->rw_nwaitwriters++; in pthread_rwlock_wrlock()
546 result = pthread_cond_wait(&rwlock->rw_condwriters, &rwlock->rw_mutex); in pthread_rwlock_wrlock()
548 rwlock->rw_nwaitwriters--; in pthread_rwlock_wrlock()
555 rwlock->rw_refcount = -1; in pthread_rwlock_wrlock()
557 pthread_mutex_unlock(&rwlock->rw_mutex); in pthread_rwlock_wrlock()