KallistiOS
##version##
Main Page
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
kernel
arch
dreamcast
include
arch
spinlock.h
Go to the documentation of this file.
1
/* KallistiOS ##version##
2
3
arch/dreamcast/include/spinlock.h
4
Copyright (C) 2001 Dan Potter
5
6
*/
7
8
/** \file arch/spinlock.h
9
\brief Simple locking.
10
11
This file contains definitions for very simple locks. Most of the time, you
12
will probably not use such low-level locking, but will opt for something
13
more fully featured like mutexes, semaphores, reader-writer semaphores, or
14
recursive locks.
15
16
\author Dan Potter
17
18
\see kos/sem.h
19
\see kos/mutex.h
20
\see kos/rwsem.h
21
\see kos/recursive_lock.h
22
*/
23
24
#ifndef __ARCH_SPINLOCK_H
25
#define __ARCH_SPINLOCK_H
26
27
/* Defines processor specific spinlocks */
28
29
#include <sys/cdefs.h>
30
__BEGIN_DECLS
31
32
/* DC implementation uses threads most of the time */
33
#include <
kos/thread.h
>
34
35
/** \brief Spinlock data type. */
36
typedef
volatile
int
spinlock_t
;
37
38
/** \brief Spinlock initializer.
39
40
All created spinlocks should be initialized with this initializer so that
41
they are in a sane state, ready to be used.
42
*/
43
#define SPINLOCK_INITIALIZER 0
44
45
/** \brief Initialize a spinlock.
46
47
This function-like macro abstracts initializing a spinlock, in case the
48
initializer is not applicable to what you are doing.
49
50
\param A A pointer to the spinlock to be initialized.
51
*/
52
#define spinlock_init(A) *(A) = SPINLOCK_INITIALIZER
53
54
/* Note here that even if threads aren't enabled, we'll still set the
55
lock so that it can be used for anti-IRQ protection (e.g., malloc) */
56
57
/** \brief Spin on a lock.
58
59
This macro will spin on the lock, and will not return until the lock has
60
been obtained for the calling thread.
61
62
\param A A pointer to the spinlock to be locked.
63
*/
64
#define spinlock_lock(A) do { \
65
spinlock_t * __lock = A; \
66
int __gotlock = 0; \
67
while(1) { \
68
__asm__ __volatile__("tas.b @%1\n\t" \
69
"movt %0\n\t" \
70
: "=r" (__gotlock) \
71
: "r" (__lock) \
72
: "t", "memory"); \
73
if (!__gotlock) \
74
thd_pass(); \
75
else break; \
76
} \
77
} while (0)
78
79
/** \brief Free a lock.
80
81
This macro will unlock the lock that is currently held by the calling
82
thread. Do not use this macro unless you actually hold the lock!
83
84
\param A A pointer to the spinlock to be unlocked.
85
*/
86
#define spinlock_unlock(A) do { \
87
*(A) = 0; \
88
} while (0)
89
90
/** \brief Determine if a lock is locked.
91
92
This macro will return whether or not the lock specified is actually locked
93
when it is called. This is NOT a thread-safe way of determining if a lock
94
will be locked when you get around to locking it!
95
96
\param A A pointer to the spinlock to be checked.
97
*/
98
#define spinlock_is_locked(A) ( *(A) != 0 )
99
100
__END_DECLS
101
102
#endif
/* __ARCH_SPINLOCK_H */
103
spinlock_t
volatile int spinlock_t
Spinlock data type.
Definition:
spinlock.h:36
thread.h
Threading support.
Generated by
1.8.7