root / lab4 / .minix-src / include / minix / spin.h @ 14
History | View | Annotate | Download (980 Bytes)
1 |
/* Prototypes for condition spinning helper functions (part of libsys). */
|
---|---|
2 |
#ifndef _MINIX_SPIN_H
|
3 |
#define _MINIX_SPIN_H
|
4 |
|
5 |
/* Opaque spin state structure. */
|
6 |
typedef struct { |
7 |
int s_state;
|
8 |
u32_t s_usecs; |
9 |
u64_t s_base_tsc; |
10 |
clock_t s_base_uptime; |
11 |
int s_timeout;
|
12 |
} spin_t; |
13 |
|
14 |
/* Functions. */
|
15 |
void spin_init(spin_t *s, u32_t usecs);
|
16 |
int spin_check(spin_t *s);
|
17 |
|
18 |
/* Macros. */
|
19 |
|
20 |
/* Execute a loop for at least 'u' microseconds, using spin object 's'.
|
21 |
* The body of the loop is guaranteed to be executed at least once.
|
22 |
*/
|
23 |
#define SPIN_FOR(s,u) \
|
24 |
for (spin_init((s), (u)); spin_check((s)); )
|
25 |
|
26 |
/* Return whether spin object 's' timed out after a loop. */
|
27 |
#define SPIN_TIMEOUT(s) ((s)->s_timeout)
|
28 |
|
29 |
/* Spin until the given condition becomes true, or 'u' microseconds expired.
|
30 |
* The condition is guaranteed to be checked at least once.
|
31 |
*/
|
32 |
#define SPIN_UNTIL(c,u) do { \ |
33 |
spin_t s; \ |
34 |
SPIN_FOR(&s,(u)) \ |
35 |
if (c) break; \ |
36 |
} while (0) |
37 |
|
38 |
#endif /* _MINIX_SPIN_H */ |