d9a99c290a
References github issue #1503. This significantly reworks both early thread cache access and related emergency malloc mode checking integration. As a result, we're able to to rely on emergency malloc even on systems without "good" TLS (e.g. QNX which does emutls). One big change here is we're undoing early change to have single "global" thread cache early during process lifetime. It was nice and somewhat simpler approach. But because of inherent locking during early process lifetime, we couldn't be sure of certain lock ordering aspects w.r.t. backtracing/exception-stack-unwinding. So I choose to keep it safe. So the new idea is we use SlowTLS facility to find threads' caches when normal tls isn't ready yet. It avoids holding locks around potentially recursion-ful things (like ThreadCache::ModuleInit or growing heap). But we then have to be careful to "re-attach" those early thread cache instances to regular TLS. There will nearly always be just one of such thread caches. For initial thread. But we cannot entirely rule out more general case where someone creates threads before process initializers ran and main() is reached. Another notable thing is free-ing memory in this early mode will always using slow-path deletion directly into central free list. SlowTLS facility is "simply" a generalization of previous CreateBadTLSCache code. I.e. we have a small fixed-size cache that holds "exceptional" instances of thread-identitity to thread-cache+emergency-mode-flag mappings. We also take advantage of tcmalloc::kInvalidTLSKey we introduced earlier and remove potentially raceful memory ordering between reading tls_ready_ and tls_key_. For emergency malloc detection we previously used thread_local flag. Which we cannot use on !kHaveGoodTLS systems. So we instead _remove_ thread's cache from it's normal tls storage and place it "into" SlowTLS instead for the duration of WithStacktraceScope call (which is how emergency mode is enabled now). |
||
---|---|---|
.. | ||
low_level_alloc_unittest.vcxproj | ||
low_level_alloc_unittest.vcxproj.filters |