blob: bbd3b2e06a1c6bed8f6d691e786d27d330bfc686 [file] [log] [blame]
/* Copyright (c) 2013 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Reader-writer queue locks (sleeping locks).
*
* Readers favor readers; writers favor writers. Check out rwlock.c for more
* info.
*
* One consequence of this: "if some reader holds a rwlock, then any other
* thread (including itself) can get an rlock". */
#pragma once
#include <ros/common.h>
#include <kthread.h>
#include <atomic.h>
struct rwlock {
spinlock_t lock;
atomic_t nr_readers;
bool writing;
struct cond_var readers;
struct cond_var writers;
};
typedef struct rwlock rwlock_t;
void rwinit(struct rwlock *rw_lock);
void rlock(struct rwlock *rw_lock);
bool canrlock(struct rwlock *rw_lock);
void runlock(struct rwlock *rw_lock);
void wlock(struct rwlock *rw_lock);
void wunlock(struct rwlock *rw_lock);