Lines Matching defs:rw
277 rw_amwriter(struct rumpuser_rw *rw)
280 return rw->writer == rumpuser_curlwp() && rw->readers == (unsigned)-1;
284 rw_nreaders(struct rumpuser_rw *rw)
286 unsigned nreaders = rw->readers;
292 rw_setwriter(struct rumpuser_rw *rw, int retry)
299 if (rw->downgrade) {
300 pthread_rwlock_unlock(&rw->pthrw);
311 assert(rw->readers == 0);
312 rw->writer = rumpuser_curlwp();
313 rw->readers = (unsigned)-1;
318 rw_clearwriter(struct rumpuser_rw *rw)
321 assert(rw_amwriter(rw));
322 rw->readers = 0;
323 rw->writer = NULL;
327 rw_readup(struct rumpuser_rw *rw)
331 atomic_inc_uint(&rw->readers);
333 pthread_spin_lock(&rw->spin);
334 ++rw->readers;
335 pthread_spin_unlock(&rw->spin);
340 rw_readdown(struct rumpuser_rw *rw)
344 atomic_dec_uint(&rw->readers);
346 pthread_spin_lock(&rw->spin);
347 assert(rw->readers > 0);
348 --rw->readers;
349 pthread_spin_unlock(&rw->spin);
356 struct rumpuser_rw *rw;
359 allocsz = (sizeof(*rw)+RUMPUSER_LOCKALIGN) & ~(RUMPUSER_LOCKALIGN-1);
361 NOFAIL(rw = aligned_alloc(RUMPUSER_LOCKALIGN, allocsz));
362 NOFAIL_ERRNO(pthread_rwlock_init(&rw->pthrw, NULL));
364 NOFAIL_ERRNO(pthread_spin_init(&rw->spin, PTHREAD_PROCESS_PRIVATE));
366 rw->readers = 0;
367 rw->writer = NULL;
368 rw->downgrade = 0;
370 *rwp = rw;
374 rumpuser_rw_enter(int enum_rumprwlock, struct rumpuser_rw *rw)
381 if (pthread_rwlock_trywrlock(&rw->pthrw) != 0)
383 pthread_rwlock_wrlock(&rw->pthrw)));
384 } while (rw_setwriter(rw, 1) != 0);
387 if (pthread_rwlock_tryrdlock(&rw->pthrw) != 0)
389 pthread_rwlock_rdlock(&rw->pthrw)));
390 rw_readup(rw);
396 rumpuser_rw_tryenter(int enum_rumprwlock, struct rumpuser_rw *rw)
403 rv = pthread_rwlock_trywrlock(&rw->pthrw);
405 rv = rw_setwriter(rw, 0);
408 rv = pthread_rwlock_tryrdlock(&rw->pthrw);
410 rw_readup(rw);
421 rumpuser_rw_tryupgrade(struct rumpuser_rw *rw)
439 rumpuser_rw_downgrade(struct rumpuser_rw *rw)
442 assert(rw->downgrade == 0);
443 rw->downgrade = 1;
444 rumpuser_rw_exit(rw);
450 KLOCK_WRAP(NOFAIL_ERRNO(pthread_rwlock_rdlock(&rw->pthrw)));
451 rw->downgrade = 0;
452 rw_readup(rw);
456 rumpuser_rw_exit(struct rumpuser_rw *rw)
459 if (rw_nreaders(rw))
460 rw_readdown(rw);
462 rw_clearwriter(rw);
463 NOFAIL_ERRNO(pthread_rwlock_unlock(&rw->pthrw));
467 rumpuser_rw_destroy(struct rumpuser_rw *rw)
470 NOFAIL_ERRNO(pthread_rwlock_destroy(&rw->pthrw));
472 NOFAIL_ERRNO(pthread_spin_destroy(&rw->spin));
474 free(rw);
478 rumpuser_rw_held(int enum_rumprwlock, struct rumpuser_rw *rw, int *rv)
484 *rv = rw_amwriter(rw);
487 *rv = rw_nreaders(rw);