1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| #ifndef JEMALLOC_INTERNAL_SPIN_H
| #define JEMALLOC_INTERNAL_SPIN_H
|
| #define SPIN_INITIALIZER {0U}
|
| typedef struct {
| unsigned iteration;
| } spin_t;
|
| static inline void
| spin_cpu_spinwait() {
| # if HAVE_CPU_SPINWAIT
| CPU_SPINWAIT;
| # else
| volatile int x = 0;
| x = x;
| # endif
| }
|
| static inline void
| spin_adaptive(spin_t *spin) {
| volatile uint32_t i;
|
| if (spin->iteration < 5) {
| for (i = 0; i < (1U << spin->iteration); i++) {
| spin_cpu_spinwait();
| }
| spin->iteration++;
| } else {
| #ifdef _WIN32
| SwitchToThread();
| #else
| sched_yield();
| #endif
| }
| }
|
| #undef SPIN_INLINE
|
| #endif /* JEMALLOC_INTERNAL_SPIN_H */
|
|