root / lab4 / .minix-src / include / minix / spin.h @ 14
History | View | Annotate | Download (980 Bytes)
1 | 13 | up20180614 | /* 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 */ |