diff options
Diffstat (limited to 'base/threading')
-rw-r--r-- | base/threading/thread.h | 12 | ||||
-rw-r--r-- | base/threading/thread_unittest.cc | 7 |
2 files changed, 13 insertions, 6 deletions
diff --git a/base/threading/thread.h b/base/threading/thread.h index d7451ec..2ee4fa2 100644 --- a/base/threading/thread.h +++ b/base/threading/thread.h @@ -21,6 +21,8 @@ namespace base { // pending tasks queued on the thread's message loop will run to completion // before the thread is terminated. // +// NOTE: Subclasses must call Stop() in their destructor. See ~Thread below. +// // After the thread is stopped, the destruction sequence is: // // (1) Thread::CleanUp() @@ -48,9 +50,13 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { // Destroys the thread, stopping it if necessary. // - // NOTE: If you are subclassing from Thread, and you wish for your CleanUp - // method to be called, then you need to call Stop() from your destructor. - // + // NOTE: All subclasses of Thread must call Stop() in their + // destructor, or otherwise ensure Stop() is called before the + // subclass is destructed. This is required to avoid a data race + // between the destructor modifying the vtable, and the thread's + // ThreadMain calling the virtual method Run. It also ensures that + // the CleanUp() virtual method is called on the subclass before it + // is destructed. virtual ~Thread(); // Starts the thread. Returns true if the thread was successfully started; diff --git a/base/threading/thread_unittest.cc b/base/threading/thread_unittest.cc index fe39627..68a24cf 100644 --- a/base/threading/thread_unittest.cc +++ b/base/threading/thread_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -48,7 +48,9 @@ class SleepInsideInitThread : public Thread { ANNOTATE_BENIGN_RACE( this, "Benign test-only data race on vptr - http://crbug.com/98219"); } - virtual ~SleepInsideInitThread() { } + virtual ~SleepInsideInitThread() { + Stop(); + } virtual void Init() { base::PlatformThread::Sleep(500); @@ -85,7 +87,6 @@ class CaptureToEventList : public Thread { } virtual ~CaptureToEventList() { - // Must call Stop() manually to have our CleanUp() function called. Stop(); } |