On Oct 22, 2013, at 1:31 PM, Leonard Crestez <[email protected]> wrote: > On 10/22/2013 11:16 PM, Jason Evans wrote: >> On Oct 21, 2013, at 2:12 PM, Leonard Crestez <[email protected]> wrote: >>> When using LinuxThreads pthread_setspecific triggers recursive allocation >>> on all threads. Work around this by creating a global linked list of >>> in-progress tsd initializations. >>> >>> This modifies the _tsd_get_wrapper macro-generated function. When it has >>> to initialize an TSD object it will push the item to the linked list >>> first. If this causes a recursive allocation then the _get_wrapper >>> request is satisfied from the list. When pthread_setspecific returns the >>> item is removed from the list. >>> >>> This effectively adds a very poor substitute for real TLS used only >>> during pthread_setspecific allocation recursion. >>> >>> Signed-off-by: Crestez Dan Leonard <[email protected]> >>> --- >>> include/jemalloc/internal/tsd.h | 63 >>> +++++++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 63 insertions(+) >> I don't see how this code can work. It stack-allocates block (struct >> tsd_init_block block;), then permanently links it into a ring. There are >> other less critical issues (e.g. no cleanup during thread exit, using >> pthread_mutex_t rather than malloc_mutex_t, and coding style conformance), >> but let's worry first about whether there's a feasible way to restructure >> the initialization code. > Hello, > > The link is not permanent, it is temporary until pthread_setspecific returns. > The stack-allocated block is inserted in the list by tsd_init_checkrec and > removed by tsd_init_finish, immediately after pthread_setspecific returns. It > is allocated on the stack because the lifetime is so short. Unless a lot of > threads are created the list will only contain at most one item during the > first allocation on each thread.
Ah, I misread the ring removal code in tsd_init_finish(). > I can replace pthread_mutex_t. What should I fix about the coding style to > make it acceptable? Should I move the tsd_init_* inside the malloc_tsd_funcs > macro or to some separate file? Hmm, there numerous minor style issues, but I don't want to take up a bunch of your time trying to deal with that. I'll take it from here. For future patches, take a look at FreeBSD's style(9) manual page (http://www.freebsd.org/cgi/man.cgi?query=style) for guidance. Thanks, Jason _______________________________________________ jemalloc-discuss mailing list [email protected] http://www.canonware.com/mailman/listinfo/jemalloc-discuss
