Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2085 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <typedefs.h> |
39 | #include <typedefs.h> |
40 | #include <synch/mutex.h> |
40 | #include <synch/mutex.h> |
41 | #include <synch/synch.h> |
41 | #include <synch/synch.h> |
42 | #include <synch/spinlock.h> |
42 | #include <synch/spinlock.h> |
43 | 43 | ||
44 | enum rwlock_type { |
44 | typedef enum { |
45 | RWLOCK_NONE, |
45 | RWLOCK_NONE, |
46 | RWLOCK_READER, |
46 | RWLOCK_READER, |
47 | RWLOCK_WRITER |
47 | RWLOCK_WRITER |
48 | }; |
48 | } rwlock_type_t; |
49 | 49 | ||
50 | struct rwlock { |
50 | typedef struct { |
51 | SPINLOCK_DECLARE(lock); |
51 | SPINLOCK_DECLARE(lock); |
52 | mutex_t exclusive; /**< Mutex for writers, readers can bypass it if readers_in is positive. */ |
52 | mutex_t exclusive; /**< Mutex for writers, readers can bypass it if readers_in is positive. */ |
53 | count_t readers_in; /**< Number of readers in critical section. */ |
53 | count_t readers_in; /**< Number of readers in critical section. */ |
54 | }; |
54 | } rwlock_t; |
55 | 55 | ||
56 | #define rwlock_write_lock(rwl) \ |
56 | #define rwlock_write_lock(rwl) \ |
57 | _rwlock_write_lock_timeout((rwl),SYNCH_NO_TIMEOUT,SYNCH_FLAGS_NONE) |
57 | _rwlock_write_lock_timeout((rwl),SYNCH_NO_TIMEOUT,SYNCH_FLAGS_NONE) |
58 | #define rwlock_read_lock(rwl) \ |
58 | #define rwlock_read_lock(rwl) \ |
59 | _rwlock_read_lock_timeout((rwl),SYNCH_NO_TIMEOUT,SYNCH_FLAGS_NONE) |
59 | _rwlock_read_lock_timeout((rwl),SYNCH_NO_TIMEOUT,SYNCH_FLAGS_NONE) |