blob: 3a2f0f3f78f37255d15a0f364031d519fd8add66 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _ASM_IA64_SEMAPHORE_H
2#define _ASM_IA64_SEMAPHORE_H
3
4/*
5 * Copyright (C) 1998-2000 Hewlett-Packard Co
6 * Copyright (C) 1998-2000 David Mosberger-Tang <davidm@hpl.hp.com>
7 */
8
9#include <linux/wait.h>
10#include <linux/rwsem.h>
11
12#include <asm/atomic.h>
13
14struct semaphore {
15 atomic_t count;
16 int sleepers;
17 wait_queue_head_t wait;
18};
19
20#define __SEMAPHORE_INITIALIZER(name, n) \
21{ \
22 .count = ATOMIC_INIT(n), \
23 .sleepers = 0, \
24 .wait = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \
25}
26
27#define __MUTEX_INITIALIZER(name) __SEMAPHORE_INITIALIZER(name,1)
28
29#define __DECLARE_SEMAPHORE_GENERIC(name,count) \
30 struct semaphore name = __SEMAPHORE_INITIALIZER(name, count)
31
32#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name, 1)
33#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name, 0)
34
35static inline void
36sema_init (struct semaphore *sem, int val)
37{
38 *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
39}
40
41static inline void
42init_MUTEX (struct semaphore *sem)
43{
44 sema_init(sem, 1);
45}
46
47static inline void
48init_MUTEX_LOCKED (struct semaphore *sem)
49{
50 sema_init(sem, 0);
51}
52
53extern void __down (struct semaphore * sem);
54extern int __down_interruptible (struct semaphore * sem);
55extern int __down_trylock (struct semaphore * sem);
56extern void __up (struct semaphore * sem);
57
58/*
59 * Atomically decrement the semaphore's count. If it goes negative,
60 * block the calling thread in the TASK_UNINTERRUPTIBLE state.
61 */
62static inline void
63down (struct semaphore *sem)
64{
65 might_sleep();
66 if (atomic_dec_return(&sem->count) < 0)
67 __down(sem);
68}
69
70/*
71 * Atomically decrement the semaphore's count. If it goes negative,
72 * block the calling thread in the TASK_INTERRUPTIBLE state.
73 */
74static inline int
75down_interruptible (struct semaphore * sem)
76{
77 int ret = 0;
78
79 might_sleep();
80 if (atomic_dec_return(&sem->count) < 0)
81 ret = __down_interruptible(sem);
82 return ret;
83}
84
85static inline int
86down_trylock (struct semaphore *sem)
87{
88 int ret = 0;
89
90 if (atomic_dec_return(&sem->count) < 0)
91 ret = __down_trylock(sem);
92 return ret;
93}
94
95static inline void
96up (struct semaphore * sem)
97{
98 if (atomic_inc_return(&sem->count) <= 0)
99 __up(sem);
100}
101
102#endif /* _ASM_IA64_SEMAPHORE_H */