Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: third_party/tcmalloc/chromium/src/thread_cache.cc

Issue 7050034: Merge google-perftools r109 (the current contents of third_party/tcmalloc/vendor) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/tcmalloc/chromium/src/thread_cache.cc
===================================================================
--- third_party/tcmalloc/chromium/src/thread_cache.cc (revision 88335)
+++ third_party/tcmalloc/chromium/src/thread_cache.cc (working copy)
@@ -31,18 +31,20 @@
// Author: Ken Ashcraft <opensource@google.com>
#include <config.h>
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-#include <algorithm> // for min and max
#include "thread_cache.h"
+#include <string.h> // for memcpy
+#include <algorithm> // for max, min
+#include "base/commandlineflags.h" // for SpinLockHolder
+#include "base/spinlock.h" // for SpinLockHolder
+#include "central_freelist.h" // for CentralFreeListPadded
#include "maybe_threads.h"
using std::min;
using std::max;
DEFINE_int64(tcmalloc_max_total_thread_cache_bytes,
- EnvToInt64("TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES", 16<<20),
+ EnvToInt64("TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES",
+ kDefaultOverallThreadCacheSize),
"Bound on the total amount of bytes allocated to "
"thread caches. This bound is not strict, so it is possible "
"for the cache to go over this bound in certain circumstances. ");
@@ -311,16 +313,6 @@
ASSERT(!tsd_inited_);
perftools_pthread_key_create(&heap_key_, DestroyThreadCache);
tsd_inited_ = true;
-
- // We may have used a fake pthread_t for the main thread. Fix it.
- pthread_t zero;
- memset(&zero, 0, sizeof(zero));
- SpinLockHolder h(Static::pageheap_lock());
- for (ThreadCache* h = thread_heaps_; h != NULL; h = h->next_) {
- if (h->tid_ == zero) {
- h->tid_ = pthread_self();
- }
- }
}
ThreadCache* ThreadCache::CreateCacheIfNecessary() {
@@ -328,15 +320,18 @@
ThreadCache* heap = NULL;
{
SpinLockHolder h(Static::pageheap_lock());
+ // On very old libc's, this call may crash if it happens too
+ // early. No libc using NPTL should be affected. If there
+ // is a crash here, we could use code (on linux, at least)
+ // to detect NPTL vs LinuxThreads:
+ // http://www.redhat.com/archives/phil-list/2003-April/msg00038.html
+ // If we detect not-NPTL, we could execute the old code from
+ // http://google-perftools.googlecode.com/svn/tags/google-perftools-1.7/src/thread_cache.cc
+ // that avoids calling pthread_self too early. The problem with
+ // that code is it caused a race condition when tcmalloc is linked
+ // in statically and other libraries spawn threads before main.
+ const pthread_t me = pthread_self();
- // Early on in glibc's life, we cannot even call pthread_self()
- pthread_t me;
- if (!tsd_inited_) {
- memset(&me, 0, sizeof(me));
- } else {
- me = pthread_self();
- }
-
// This may be a recursive malloc call from pthread_setspecific()
// In that case, the heap for this thread has already been created
// and added to the linked list. So we search for that first.
« no previous file with comments | « third_party/tcmalloc/chromium/src/thread_cache.h ('k') | third_party/tcmalloc/chromium/src/windows/config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698