| Index: src/platform-posix.cc
|
| diff --git a/src/platform-posix.cc b/src/platform-posix.cc
|
| index 94aabe8d581101fc08ffb95298de55cf3625c89d..0ec458905892e9488e45ee2e58df059bf60a841c 100644
|
| --- a/src/platform-posix.cc
|
| +++ b/src/platform-posix.cc
|
| @@ -583,6 +583,10 @@ Thread::~Thread() {
|
| }
|
|
|
|
|
| +// Synchronizes thread creation
|
| +static Mutex thread_creation_mutex_;
|
| +
|
| +
|
| static void SetThreadName(const char* name) {
|
| #if V8_OS_DRAGONFLYBSD || V8_OS_FREEBSD || V8_OS_OPENBSD
|
| pthread_set_name_np(pthread_self(), name);
|
| @@ -612,10 +616,10 @@ static void SetThreadName(const char* name) {
|
|
|
| static void* ThreadEntry(void* arg) {
|
| Thread* thread = reinterpret_cast<Thread*>(arg);
|
| - // This is also initialized by the first argument to pthread_create() but we
|
| - // don't know which thread will run first (the original thread or the new
|
| - // one) so we initialize it here too.
|
| - thread->data()->thread_ = pthread_self();
|
| + // We take the lock here to make sure that pthread_create finished first since
|
| + // we don't know which thread will run first (the original thread or the new
|
| + // one).
|
| + { LockGuard<Mutex> lock_guard(&thread_creation_mutex_); }
|
| SetThreadName(thread->name());
|
| ASSERT(thread->data()->thread_ != kNoThread);
|
| thread->NotifyStartedAndRun();
|
| @@ -642,7 +646,10 @@ void Thread::Start() {
|
| ASSERT_EQ(0, result);
|
| }
|
| #endif
|
| - result = pthread_create(&data_->thread_, &attr, ThreadEntry, this);
|
| + {
|
| + LockGuard<Mutex> lock_guard(&thread_creation_mutex_);
|
| + result = pthread_create(&data_->thread_, &attr, ThreadEntry, this);
|
| + }
|
| ASSERT_EQ(0, result);
|
| result = pthread_attr_destroy(&attr);
|
| ASSERT_EQ(0, result);
|
|
|