arenas.extend + thread.arena confusion
D'Alessandro, Luke K
ldalessa at indiana.edu
Tue Sep 30 11:08:10 PDT 2014
Hi everyone,
I have an application where I want every thread to have two arenas. One is use for default allocations and has access to the cache, and the other is used for private allocations through malllocx().
I do this by doing an arena.extend + thread.arena in each thread. The problem that I have is that jemalloc seems to reuse arena ids in this context. Essentially I get a trace that looks something like:
t1: t2 = pthread_create()
t1: new1 = arenas.extend
t1: old1 = thread.arena(new1)
t2: new2 = arenas.extend
t2: old2 = thread.arena(new2)
: old1 == old2 == 0
Is this behavior expected? Shouldn’t jemalloc use a fresh arena for each new thread?
The actual test code is attached.
Thanks,
Luke
—
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <pthread.h>
#include <jemalloc/jemalloc.h>
void *foo(void *UNUSED) {
unsigned old, new;
size_t sold, snew;
sold = snew = sizeof(old);
int e = mallctl("arenas.extend", &new, &snew, NULL, 0);
assert(!e);
e = mallctl("thread.arena", &old, &sold, &new, snew);
return (void*)old;
}
int main(int argc, char * const argv[]) {
pthread_t thread;
int e = pthread_create(&thread, NULL, foo, NULL);
assert(!e);
void *arena1 = foo(NULL);
void *arena2;
e = pthread_join(thread, &arena2);
assert(!e);
printf("Saw arenas %u and %u.\n", (unsigned)arena1, (unsigned)arena2);
assert((unsigned)arena1 != (unsigned)arena2);
return 0;
}
More information about the jemalloc-discuss
mailing list