Skip to content

Commit cdd92de

Browse files
jasoneyuslepukhin
authored andcommitted
Bring spinning from e5effef428b5bf941e1697f6000c97f1ce734756
1 parent ea4ea71 commit cdd92de

File tree

7 files changed

+66
-2
lines changed

7 files changed

+66
-2
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ set(C_SRCS
524524
src/quarantine.c
525525
src/rtree.c
526526
src/stats.c
527+
src/spin.c
527528
src/tcache.c
528529
src/ticker.c
529530
src/tsd.c

Makefile.in

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ C_SRCS := $(srcroot)src/jemalloc.c \
9999
$(srcroot)src/quarantine.c \
100100
$(srcroot)src/rtree.c \
101101
$(srcroot)src/stats.c \
102+
$(srcroot)src/spin.c \
102103
$(srcroot)src/tcache.c \
103104
$(srcroot)src/ticker.c \
104105
$(srcroot)src/tsd.c \

include/jemalloc/internal/jemalloc_internal.h.in

+4
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ typedef unsigned szind_t;
364364
#include "jemalloc/internal/valgrind.h"
365365
#include "jemalloc/internal/util.h"
366366
#include "jemalloc/internal/atomic.h"
367+
#include "jemalloc/internal/spin.h"
367368
#include "jemalloc/internal/prng.h"
368369
#include "jemalloc/internal/ticker.h"
369370
#include "jemalloc/internal/ckh.h"
@@ -396,6 +397,7 @@ typedef unsigned szind_t;
396397
#include "jemalloc/internal/valgrind.h"
397398
#include "jemalloc/internal/util.h"
398399
#include "jemalloc/internal/atomic.h"
400+
#include "jemalloc/internal/spin.h"
399401
#include "jemalloc/internal/prng.h"
400402
#include "jemalloc/internal/ticker.h"
401403
#include "jemalloc/internal/ckh.h"
@@ -493,6 +495,7 @@ void jemalloc_postfork_child(void);
493495
#include "jemalloc/internal/valgrind.h"
494496
#include "jemalloc/internal/util.h"
495497
#include "jemalloc/internal/atomic.h"
498+
#include "jemalloc/internal/spin.h"
496499
#include "jemalloc/internal/prng.h"
497500
#include "jemalloc/internal/ticker.h"
498501
#include "jemalloc/internal/ckh.h"
@@ -525,6 +528,7 @@ void jemalloc_postfork_child(void);
525528
#include "jemalloc/internal/valgrind.h"
526529
#include "jemalloc/internal/util.h"
527530
#include "jemalloc/internal/atomic.h"
531+
#include "jemalloc/internal/spin.h"
528532
#include "jemalloc/internal/prng.h"
529533
#include "jemalloc/internal/ticker.h"
530534
#include "jemalloc/internal/ckh.h"

include/jemalloc/internal/spin.h

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/******************************************************************************/
2+
#ifdef JEMALLOC_H_TYPES
3+
4+
typedef struct spin_s spin_t;
5+
6+
#endif /* JEMALLOC_H_TYPES */
7+
/******************************************************************************/
8+
#ifdef JEMALLOC_H_STRUCTS
9+
10+
struct spin_s {
11+
unsigned iteration;
12+
};
13+
14+
#endif /* JEMALLOC_H_STRUCTS */
15+
/******************************************************************************/
16+
#ifdef JEMALLOC_H_EXTERNS
17+
18+
#endif /* JEMALLOC_H_EXTERNS */
19+
/******************************************************************************/
20+
#ifdef JEMALLOC_H_INLINES
21+
22+
#ifndef JEMALLOC_ENABLE_INLINE
23+
void spin_init(spin_t *spin);
24+
void spin_adaptive(spin_t *spin);
25+
#endif
26+
27+
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_SPIN_C_))
28+
JEMALLOC_INLINE void
29+
spin_init(spin_t *spin)
30+
{
31+
32+
spin->iteration = 0;
33+
}
34+
35+
JEMALLOC_INLINE void
36+
spin_adaptive(spin_t *spin)
37+
{
38+
volatile uint64_t i;
39+
40+
for (i = 0; i < (KQU(1) << spin->iteration); i++)
41+
CPU_SPINWAIT;
42+
43+
if (spin->iteration < 63)
44+
spin->iteration++;
45+
}
46+
47+
#endif
48+
49+
#endif /* JEMALLOC_H_INLINES */
50+
/******************************************************************************/
51+

src/jemalloc.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -1256,10 +1256,12 @@ malloc_init_hard_needed(void)
12561256
}
12571257
#ifdef JEMALLOC_THREADED_INIT
12581258
if (malloc_initializer != NO_INITIALIZER && !IS_INITIALIZER) {
1259+
spin_t spinner;
12591260
/* Busy-wait until the initializing thread completes. */
1261+
spin_init(&spinner);
12601262
do {
12611263
malloc_mutex_unlock(NULL, &init_lock);
1262-
CPU_SPINWAIT;
1264+
spin_adaptive(&spinner);
12631265
malloc_mutex_lock(NULL, &init_lock);
12641266
} while (!malloc_initialized());
12651267
return (false);

src/rtree.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,15 @@ rtree_node_init(rtree_t *rtree, unsigned level, rtree_node_elm_t **elmp)
9696
rtree_node_elm_t *node;
9797

9898
if (atomic_cas_p((void **)elmp, NULL, RTREE_NODE_INITIALIZING)) {
99+
spin_t spinner;
100+
99101
/*
100102
* Another thread is already in the process of initializing.
101103
* Spin-wait until initialization is complete.
102104
*/
105+
spin_init(&spinner);
103106
do {
104-
CPU_SPINWAIT;
107+
spin_adaptive(&spinner);
105108
node = atomic_read_p((void **)elmp);
106109
} while (node == RTREE_NODE_INITIALIZING);
107110
} else {

src/spin.c

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define JEMALLOC_SPIN_C_
2+
#include "jemalloc/internal/jemalloc_internal.h"

0 commit comments

Comments
 (0)