1/* rwsem-spinlock.h: fallback C implementation
2 *
3 * Copyright (c) 2001   David Howells (dhowells@redhat.com).
4 * - Derived partially from ideas by Andrea Arcangeli <andrea@suse.de>
5 * - Derived also from comments by Linus
6 *
7 * Trylock by Brian Watson (Brian.J.Watson@compaq.com).
8 */
9
10#ifndef _LINUX_RWSEM_SPINLOCK_H
11#define _LINUX_RWSEM_SPINLOCK_H
12
13#ifndef _LINUX_RWSEM_H
14#error please dont include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead
15#endif
16
17#include <linux/spinlock.h>
18#include <linux/list.h>
19
20#ifdef __KERNEL__
21
22#include <linux/types.h>
23
24struct rwsem_waiter;
25
26/*
27 * the rw-semaphore definition
28 * - if activity is 0 then there are no active readers or writers
29 * - if activity is +ve then that is the number of active readers
30 * - if activity is -1 then there is one active writer
31 * - if wait_list is not empty, then there are processes waiting for the semaphore
32 */
33struct rw_semaphore {
34	__s32			activity;
35	spinlock_t		wait_lock;
36	struct list_head	wait_list;
37#if RWSEM_DEBUG
38	int			debug;
39#endif
40};
41
42/*
43 * initialisation
44 */
45#if RWSEM_DEBUG
46#define __RWSEM_DEBUG_INIT      , 0
47#else
48#define __RWSEM_DEBUG_INIT	/* */
49#endif
50
51#define __RWSEM_INITIALIZER(name) \
52{ 0, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __RWSEM_DEBUG_INIT }
53
54#define DECLARE_RWSEM(name) \
55	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
56
57extern void FASTCALL(init_rwsem(struct rw_semaphore *sem));
58extern void FASTCALL(__down_read(struct rw_semaphore *sem));
59extern int FASTCALL(__down_read_trylock(struct rw_semaphore *sem));
60extern void FASTCALL(__down_write(struct rw_semaphore *sem));
61extern int FASTCALL(__down_write_trylock(struct rw_semaphore *sem));
62extern void FASTCALL(__up_read(struct rw_semaphore *sem));
63extern void FASTCALL(__up_write(struct rw_semaphore *sem));
64
65#endif /* __KERNEL__ */
66#endif /* _LINUX_RWSEM_SPINLOCK_H */
67