summaryrefslogtreecommitdiffstats
path: root/base/threading
diff options
context:
space:
mode:
Diffstat (limited to 'base/threading')
-rw-r--r--base/threading/thread.h12
-rw-r--r--base/threading/thread_unittest.cc7
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();
}