Home | History | Annotate | Download | only in librumpuser

Lines Matching defs:rw

778 rw;
780 rw = malloc(sizeof(*rw));
781 memset(rw, 0, sizeof(*rw));
782 TAILQ_INIT(&rw->rwait);
783 TAILQ_INIT(&rw->wwait);
785 *rwp = rw;
789 rumpuser_rw_enter(int enum_rumprwlock, struct rumpuser_rw *rw)
797 w = &rw->wwait;
800 w = &rw->rwait;
804 if (rumpuser_rw_tryenter(enum_rumprwlock, rw) != 0) {
806 while (rumpuser_rw_tryenter(enum_rumprwlock, rw) != 0)
813 rumpuser_rw_tryenter(int enum_rumprwlock, struct rumpuser_rw *rw)
820 if (rw->o == NULL) {
821 rw->o = rumpuser_curlwp();
828 if (rw->o == NULL && TAILQ_EMPTY(&rw->wwait)) {
829 rw->v++;
843 rumpuser_rw_exit(struct rumpuser_rw *rw)
846 if (rw->o) {
847 rw->o = NULL;
849 rw->v--;
853 if (!TAILQ_EMPTY(&rw->wwait)) {
854 if (rw->o == NULL)
855 wakeup_one(&rw->wwait);
856 } else if (!TAILQ_EMPTY(&rw->rwait) && rw->o == NULL) {
857 wakeup_all(&rw->rwait);
862 rumpuser_rw_destroy(struct rumpuser_rw *rw)
865 free(rw);
869 rumpuser_rw_held(int enum_rumprwlock, struct rumpuser_rw *rw, int *rvp)
875 *rvp = rw->o == rumpuser_curlwp();
878 *rvp = rw->v > 0;
884 rumpuser_rw_downgrade(struct rumpuser_rw *rw)
887 assert(rw->o == rumpuser_curlwp());
888 rw->v = -1;
892 rumpuser_rw_tryupgrade(struct rumpuser_rw *rw)
895 if (rw->v == -1) {
896 rw->v = 1;
897 rw->o = rumpuser_curlwp();