Project

General

Profile

Statistics
| Revision:

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 */