summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 18:12:55 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 18:12:55 +0000
commit13f383ff5fc8ff095501794d4ce758f0067ff9b5 (patch)
treeceb1d08f38759bf8805ede009924a990bae496e5
parentf61f331824ac9c98684a886be0d918aefe69d3ce (diff)
downloadchromium_src-13f383ff5fc8ff095501794d4ce758f0067ff9b5.zip
chromium_src-13f383ff5fc8ff095501794d4ce758f0067ff9b5.tar.gz
chromium_src-13f383ff5fc8ff095501794d4ce758f0067ff9b5.tar.bz2
Assert that thread-safe reference counting is used with
cross-thread NewRunnableMethod. This assertion caught such an error in VisitedLinkMaster! My approach, modify RunnableMethodTraits<T> to assert that when ReleaseCallee happens on a different thread from RetainCallee that the type supports thread-safe reference counting. I do this by adding a static method to both RefCounted<T> and RefCountedThreadSafe<T>. This results in a little ugliness in cases where people implement AddRef and Release by hand (to make the no-ops). There may be a nicer way to deal with those few cases. R=brettw BUG=none TEST=none Review URL: http://codereview.chromium.org/251012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27379 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/message_pump_glib_unittest.cc4
-rw-r--r--base/ref_counted.h4
-rw-r--r--base/task.h34
-rw-r--r--chrome/browser/browser_process_impl.cc4
-rw-r--r--chrome/browser/browsing_data_remover.cc15
-rw-r--r--chrome/browser/chrome_plugin_host.cc13
-rw-r--r--chrome/browser/chromeos/touchpad.cc13
-rw-r--r--chrome/browser/dom_ui/chrome_url_data_manager.h4
-rw-r--r--chrome/browser/gears_integration.cc26
-rw-r--r--chrome/browser/history/history_unittest.cc4
-rw-r--r--chrome/browser/printing/print_job.h11
-rw-r--r--chrome/browser/printing/print_job_unittest.cc10
-rw-r--r--chrome/browser/printing/print_job_worker.cc3
-rw-r--r--chrome/browser/printing/print_job_worker.h1
-rw-r--r--chrome/browser/printing/print_job_worker_owner.h6
-rw-r--r--chrome/browser/printing/printer_query.h10
-rw-r--r--chrome/browser/renderer_host/render_crash_handler_host_linux.cc4
-rw-r--r--chrome/browser/visitedlink_master.cc5
-rw-r--r--chrome/common/extensions/extension_error_reporter.cc4
-rw-r--r--chrome/test/in_process_browser_test.h1
-rw-r--r--chrome/test/interactive_ui/view_event_test_base.h1
-rw-r--r--chrome_frame/chrome_frame_automation.cc4
-rw-r--r--chrome_frame/chrome_frame_delegate.h7
-rw-r--r--chrome_frame/test/chrome_frame_unittests.cc24
-rw-r--r--ipc/ipc_logging.cc4
-rw-r--r--ipc/ipc_sync_channel_unittest.cc1
-rw-r--r--net/proxy/proxy_config_service_linux_unittest.cc11
27 files changed, 106 insertions, 122 deletions
diff --git a/base/message_pump_glib_unittest.cc b/base/message_pump_glib_unittest.cc
index e0ad260..e3a04e8 100644
--- a/base/message_pump_glib_unittest.cc
+++ b/base/message_pump_glib_unittest.cc
@@ -185,8 +185,8 @@ class MessagePumpGLibTest : public testing::Test {
// This lets us call NewRunnableMethod on EventInjector instances.
template<>
struct RunnableMethodTraits<EventInjector> {
- static void RetainCallee(EventInjector* obj) { }
- static void ReleaseCallee(EventInjector* obj) { }
+ void RetainCallee(EventInjector* obj) { }
+ void ReleaseCallee(EventInjector* obj) { }
};
TEST_F(MessagePumpGLibTest, TestQuit) {
diff --git a/base/ref_counted.h b/base/ref_counted.h
index 097d16e..70536b9 100644
--- a/base/ref_counted.h
+++ b/base/ref_counted.h
@@ -14,6 +14,8 @@ namespace subtle {
class RefCountedBase {
public:
+ static bool ImplementsThreadSafeReferenceCounting() { return false; }
+
bool HasOneRef() const { return ref_count_ == 1; }
protected:
@@ -38,6 +40,8 @@ class RefCountedBase {
class RefCountedThreadSafeBase {
public:
+ static bool ImplementsThreadSafeReferenceCounting() { return true; }
+
bool HasOneRef() const;
protected:
diff --git a/base/task.h b/base/task.h
index c827681..e9da8b3 100644
--- a/base/task.h
+++ b/base/task.h
@@ -205,12 +205,33 @@ class ReleaseTask : public CancelableTask {
template <class T>
struct RunnableMethodTraits {
- static void RetainCallee(T* obj) {
+ RunnableMethodTraits() {
+#ifndef NDEBUG
+ origin_thread_id_ = PlatformThread::CurrentId();
+#endif
+ }
+
+ ~RunnableMethodTraits() {
+#ifndef NDEBUG
+ // If destroyed on a separate thread, then we had better have been using
+ // thread-safe reference counting!
+ if (origin_thread_id_ != PlatformThread::CurrentId())
+ DCHECK(T::ImplementsThreadSafeReferenceCounting());
+#endif
+ }
+
+ void RetainCallee(T* obj) {
obj->AddRef();
}
- static void ReleaseCallee(T* obj) {
+
+ void ReleaseCallee(T* obj) {
obj->Release();
}
+
+ private:
+#ifndef NDEBUG
+ PlatformThreadId origin_thread_id_;
+#endif
};
// RunnableMethod and RunnableFunction -----------------------------------------
@@ -240,13 +261,13 @@ struct RunnableMethodTraits {
// RunnableMethod and NewRunnableMethod implementation -------------------------
template <class T, class Method, class Params>
-class RunnableMethod : public CancelableTask,
- public RunnableMethodTraits<T> {
+class RunnableMethod : public CancelableTask {
public:
RunnableMethod(T* obj, Method meth, const Params& params)
: obj_(obj), meth_(meth), params_(params) {
- RetainCallee(obj_);
+ traits_.RetainCallee(obj_);
}
+
~RunnableMethod() {
ReleaseCallee();
}
@@ -263,7 +284,7 @@ class RunnableMethod : public CancelableTask,
private:
void ReleaseCallee() {
if (obj_) {
- RunnableMethodTraits<T>::ReleaseCallee(obj_);
+ traits_.ReleaseCallee(obj_);
obj_ = NULL;
}
}
@@ -271,6 +292,7 @@ class RunnableMethod : public CancelableTask,
T* obj_;
Method meth_;
Params params_;
+ RunnableMethodTraits<T> traits_;
};
template <class T, class Method>
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index f971e80..918d970 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -442,8 +442,8 @@ void BrowserProcessImpl::CreateGoogleURLTracker() {
// which don't do any management.
template <>
struct RunnableMethodTraits<BrowserProcessImpl> {
- static void RetainCallee(BrowserProcessImpl*) {}
- static void ReleaseCallee(BrowserProcessImpl*) {}
+ void RetainCallee(BrowserProcessImpl*) {}
+ void ReleaseCallee(BrowserProcessImpl*) {}
};
void BrowserProcessImpl::CheckForInspectorFiles() {
diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc
index 96e1543..6d70cc9 100644
--- a/chrome/browser/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data_remover.cc
@@ -22,16 +22,13 @@
#include "net/url_request/url_request_context.h"
#include "webkit/glue/password_form.h"
-// Done so that we can use invokeLater on BrowsingDataRemovers and not have
+// Done so that we can use PostTask on BrowsingDataRemovers and not have
// BrowsingDataRemover implement RefCounted.
-template<>
-void RunnableMethodTraits<BrowsingDataRemover>::RetainCallee(
- BrowsingDataRemover* remover) {
-}
-template<>
-void RunnableMethodTraits<BrowsingDataRemover>::ReleaseCallee(
- BrowsingDataRemover* remover) {
-}
+template <>
+struct RunnableMethodTraits<BrowsingDataRemover> {
+ void RetainCallee(BrowsingDataRemover*) {}
+ void ReleaseCallee(BrowsingDataRemover*) {}
+};
bool BrowsingDataRemover::removing_ = false;
diff --git a/chrome/browser/chrome_plugin_host.cc b/chrome/browser/chrome_plugin_host.cc
index 1b62b9a..bfb5852 100644
--- a/chrome/browser/chrome_plugin_host.cc
+++ b/chrome/browser/chrome_plugin_host.cc
@@ -367,14 +367,11 @@ class ModelessHtmlDialogDelegate : public HtmlDialogUIDelegate {
// Allows InvokeLater without adding refcounting. The object is only deleted
// when its last InvokeLater is run anyway.
-template<>
-void RunnableMethodTraits<ModelessHtmlDialogDelegate>::RetainCallee(
- ModelessHtmlDialogDelegate* remover) {
-}
-template<>
-void RunnableMethodTraits<ModelessHtmlDialogDelegate>::ReleaseCallee(
- ModelessHtmlDialogDelegate* remover) {
-}
+template <>
+struct RunnableMethodTraits<ModelessHtmlDialogDelegate> {
+ void RetainCallee(ModelessHtmlDialogDelegate*) {}
+ void ReleaseCallee(ModelessHtmlDialogDelegate*) {}
+};
namespace {
diff --git a/chrome/browser/chromeos/touchpad.cc b/chrome/browser/chromeos/touchpad.cc
index 81a7eb4..e4c27b3 100644
--- a/chrome/browser/chromeos/touchpad.cc
+++ b/chrome/browser/chromeos/touchpad.cc
@@ -19,14 +19,11 @@
// Allows InvokeLater without adding refcounting. The object is only deleted
// when its last InvokeLater is run anyway.
-template<>
-void RunnableMethodTraits<Touchpad>::RetainCallee(
- Touchpad* remover) {
-}
-template<>
-void RunnableMethodTraits<Touchpad>::ReleaseCallee(
- Touchpad* remover) {
-}
+template <>
+struct RunnableMethodTraits<Touchpad> {
+ void RetainCallee(Touchpad*) {}
+ void ReleaseCallee(Touchpad*) {}
+};
// static
void Touchpad::RegisterUserPrefs(PrefService* prefs) {
diff --git a/chrome/browser/dom_ui/chrome_url_data_manager.h b/chrome/browser/dom_ui/chrome_url_data_manager.h
index 81f220c..80fc862 100644
--- a/chrome/browser/dom_ui/chrome_url_data_manager.h
+++ b/chrome/browser/dom_ui/chrome_url_data_manager.h
@@ -153,8 +153,8 @@ private:
// Since we have a single global ChromeURLDataManager, we don't need to
// grab a reference to it when creating Tasks involving it.
template <> struct RunnableMethodTraits<ChromeURLDataManager> {
- static void RetainCallee(ChromeURLDataManager*) {}
- static void ReleaseCallee(ChromeURLDataManager*) {}
+ void RetainCallee(ChromeURLDataManager*) {}
+ void ReleaseCallee(ChromeURLDataManager*) {}
};
// The single global instance of ChromeURLDataManager.
diff --git a/chrome/browser/gears_integration.cc b/chrome/browser/gears_integration.cc
index 6805175..d7cf898 100644
--- a/chrome/browser/gears_integration.cc
+++ b/chrome/browser/gears_integration.cc
@@ -225,14 +225,11 @@ class CreateShortcutCommand : public CPCommandInterface {
// Allows InvokeLater without adding refcounting. The object is only deleted
// when its last InvokeLater is run anyway.
-template<>
-void RunnableMethodTraits<CreateShortcutCommand>::RetainCallee(
- CreateShortcutCommand* remover) {
-}
-template<>
-void RunnableMethodTraits<CreateShortcutCommand>::ReleaseCallee(
- CreateShortcutCommand* remover) {
-}
+template <>
+struct RunnableMethodTraits<CreateShortcutCommand> {
+ void RetainCallee(CreateShortcutCommand*) {}
+ void ReleaseCallee(CreateShortcutCommand*) {}
+};
void GearsCreateShortcut(
const webkit_glue::WebApplicationInfo& app_info,
@@ -299,14 +296,11 @@ class QueryShortcutsCommand : public CPCommandInterface {
// Allows InvokeLater without adding refcounting. The object is only deleted
// when its last InvokeLater is run anyway.
-template<>
-void RunnableMethodTraits<QueryShortcutsCommand>::RetainCallee(
- QueryShortcutsCommand* remover) {
-}
-template<>
-void RunnableMethodTraits<QueryShortcutsCommand>::ReleaseCallee(
- QueryShortcutsCommand* remover) {
-}
+template <>
+struct RunnableMethodTraits<QueryShortcutsCommand> {
+ void RetainCallee(QueryShortcutsCommand*) {}
+ void ReleaseCallee(QueryShortcutsCommand*) {}
+};
void GearsQueryShortcuts(GearsQueryShortcutsCallback* callback) {
CPHandleCommand(GEARSPLUGINCOMMAND_GET_SHORTCUT_LIST,
diff --git a/chrome/browser/history/history_unittest.cc b/chrome/browser/history/history_unittest.cc
index 23463440..f26aa9d 100644
--- a/chrome/browser/history/history_unittest.cc
+++ b/chrome/browser/history/history_unittest.cc
@@ -57,8 +57,8 @@ class HistoryTest;
// the HistoryTest object.
template <>
struct RunnableMethodTraits<history::HistoryTest> {
- static void RetainCallee(history::HistoryTest* obj) { }
- static void ReleaseCallee(history::HistoryTest* obj) { }
+ void RetainCallee(history::HistoryTest* obj) { }
+ void ReleaseCallee(history::HistoryTest* obj) { }
};
namespace history {
diff --git a/chrome/browser/printing/print_job.h b/chrome/browser/printing/print_job.h
index 45d5d12..cf4badc 100644
--- a/chrome/browser/printing/print_job.h
+++ b/chrome/browser/printing/print_job.h
@@ -8,7 +8,6 @@
#include "base/basictypes.h"
#include "base/gfx/native_widget_types.h"
#include "base/message_loop.h"
-#include "base/ref_counted.h"
#include "chrome/browser/printing/print_job_worker_owner.h"
#include "chrome/common/notification_registrar.h"
@@ -32,9 +31,8 @@ class PrinterQuery;
// any state change. While printing, the PrintJobManager instance keeps a
// reference to the job to be sure it is kept alive. All the code in this class
// runs in the UI thread.
-class PrintJob : public base::RefCountedThreadSafe<PrintJob>,
+class PrintJob : public PrintJobWorkerOwner,
public NotificationObserver,
- public PrintJobWorkerOwner,
public MessageLoop::DestructionObserver {
public:
// Create a empty PrintJob. When initializing with this constructor,
@@ -52,13 +50,6 @@ class PrintJob : public base::RefCountedThreadSafe<PrintJob>,
const NotificationDetails& details);
// PrintJobWorkerOwner
- virtual void AddRef() {
- return base::RefCountedThreadSafe<PrintJob>::AddRef();
- }
- virtual void Release() {
- return base::RefCountedThreadSafe<PrintJob>::Release();
- }
-
virtual void GetSettingsDone(const PrintSettings& new_settings,
PrintingContext::Result result);
virtual PrintJobWorker* DetachWorker(PrintJobWorkerOwner* new_owner);
diff --git a/chrome/browser/printing/print_job_unittest.cc b/chrome/browser/printing/print_job_unittest.cc
index fe98964..3ef795c 100644
--- a/chrome/browser/printing/print_job_unittest.cc
+++ b/chrome/browser/printing/print_job_unittest.cc
@@ -33,12 +33,6 @@ class TestPrintJobWorker : public printing::PrintJobWorker {
class TestOwner : public printing::PrintJobWorkerOwner {
public:
- virtual void AddRef() {
- EXPECT_FALSE(true);
- }
- virtual void Release() {
- EXPECT_FALSE(true);
- }
virtual void GetSettingsDone(const printing::PrintSettings& new_settings,
printing::PrintingContext::Result result) {
EXPECT_FALSE(true);
@@ -104,9 +98,9 @@ TEST(PrintJobTest, SimplePrint) {
volatile bool check = false;
scoped_refptr<printing::PrintJob> job(new TestPrintJob(&check));
EXPECT_EQ(MessageLoop::current(), job->message_loop());
- TestOwner owner;
+ scoped_refptr<TestOwner> owner(new TestOwner);
TestSource source;
- job->Initialize(&owner, &source);
+ job->Initialize(owner, &source);
job->Stop();
job = NULL;
EXPECT_TRUE(check);
diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc
index caf5ad3..375c2407 100644
--- a/chrome/browser/printing/print_job_worker.cc
+++ b/chrome/browser/printing/print_job_worker.cc
@@ -275,9 +275,6 @@ void PrintJobWorker::OnFailure() {
} // namespace printing
-RunnableMethodTraits<printing::PrintJobWorker>::RunnableMethodTraits() {
-}
-
void RunnableMethodTraits<printing::PrintJobWorker>::RetainCallee(
printing::PrintJobWorker* obj) {
DCHECK(!owner_.get());
diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h
index 9ad2c39..fce8912 100644
--- a/chrome/browser/printing/print_job_worker.h
+++ b/chrome/browser/printing/print_job_worker.h
@@ -98,7 +98,6 @@ class PrintJobWorker : public base::Thread {
template <>
struct RunnableMethodTraits<printing::PrintJobWorker> {
- RunnableMethodTraits();
void RetainCallee(printing::PrintJobWorker* obj);
void ReleaseCallee(printing::PrintJobWorker* obj);
private:
diff --git a/chrome/browser/printing/print_job_worker_owner.h b/chrome/browser/printing/print_job_worker_owner.h
index 1810eca..e1ba719 100644
--- a/chrome/browser/printing/print_job_worker_owner.h
+++ b/chrome/browser/printing/print_job_worker_owner.h
@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_OWNER_H__
#define CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_OWNER_H__
+#include "base/ref_counted.h"
#include "printing/printing_context.h"
class MessageLoop;
@@ -14,12 +15,11 @@ namespace printing {
class PrintJobWorker;
class PrintSettings;
-class PrintJobWorkerOwner {
+class PrintJobWorkerOwner :
+ public base::RefCountedThreadSafe<PrintJobWorkerOwner> {
public:
virtual ~PrintJobWorkerOwner() {
}
- virtual void AddRef() = 0;
- virtual void Release() = 0;
// Finishes the initialization began by PrintJobWorker::Init(). Creates a
// new PrintedDocument if necessary. Solely meant to be called by
diff --git a/chrome/browser/printing/printer_query.h b/chrome/browser/printing/printer_query.h
index 6d6fd88..b0502c8 100644
--- a/chrome/browser/printing/printer_query.h
+++ b/chrome/browser/printing/printer_query.h
@@ -6,7 +6,6 @@
#define CHROME_BROWSER_PRINTING_PRINTER_QUERY_H_
#include "base/scoped_ptr.h"
-#include "base/ref_counted.h"
#include "chrome/browser/printing/print_job_worker_owner.h"
class CancelableTask;
@@ -21,8 +20,7 @@ namespace printing {
class PrintJobWorker;
// Query the printer for settings.
-class PrinterQuery : public base::RefCountedThreadSafe<PrinterQuery>,
- public PrintJobWorkerOwner {
+class PrinterQuery : public PrintJobWorkerOwner {
public:
// GetSettings() UI parameter.
enum GetSettingsAskParam {
@@ -34,12 +32,6 @@ class PrinterQuery : public base::RefCountedThreadSafe<PrinterQuery>,
virtual ~PrinterQuery();
// PrintJobWorkerOwner
- virtual void AddRef() {
- return base::RefCountedThreadSafe<PrinterQuery>::AddRef();
- }
- virtual void Release() {
- return base::RefCountedThreadSafe<PrinterQuery>::Release();
- }
virtual void GetSettingsDone(const PrintSettings& new_settings,
PrintingContext::Result result);
virtual PrintJobWorker* DetachWorker(PrintJobWorkerOwner* new_owner);
diff --git a/chrome/browser/renderer_host/render_crash_handler_host_linux.cc b/chrome/browser/renderer_host/render_crash_handler_host_linux.cc
index 4e9fdf9..805e231 100644
--- a/chrome/browser/renderer_host/render_crash_handler_host_linux.cc
+++ b/chrome/browser/renderer_host/render_crash_handler_host_linux.cc
@@ -151,8 +151,8 @@ static bool FindProcessHoldingSocket(pid_t* pid_out, uint64_t socket_inode) {
// end of the processes lifetime, which is greater in span then the lifetime of
// the IO message loop.
template<> struct RunnableMethodTraits<RenderCrashHandlerHostLinux> {
- static void RetainCallee(RenderCrashHandlerHostLinux*) { }
- static void ReleaseCallee(RenderCrashHandlerHostLinux*) { }
+ void RetainCallee(RenderCrashHandlerHostLinux*) { }
+ void ReleaseCallee(RenderCrashHandlerHostLinux*) { }
};
RenderCrashHandlerHostLinux::RenderCrashHandlerHostLinux()
diff --git a/chrome/browser/visitedlink_master.cc b/chrome/browser/visitedlink_master.cc
index 0e1ac9c..6bd06bb 100644
--- a/chrome/browser/visitedlink_master.cc
+++ b/chrome/browser/visitedlink_master.cc
@@ -165,8 +165,9 @@ class AsyncCloseHandle : public Task {
// Sometimes, the master will be deleted before the rebuild is complete, in
// which case it notifies the builder via DisownMaster(). The builder will
// delete itself once rebuilding is complete, and not execute any callback.
-class VisitedLinkMaster::TableBuilder : public HistoryService::URLEnumerator,
- public base::RefCounted<TableBuilder> {
+class VisitedLinkMaster::TableBuilder :
+ public HistoryService::URLEnumerator,
+ public base::RefCountedThreadSafe<TableBuilder> {
public:
TableBuilder(VisitedLinkMaster* master,
const uint8 salt[LINK_SALT_LENGTH]);
diff --git a/chrome/common/extensions/extension_error_reporter.cc b/chrome/common/extensions/extension_error_reporter.cc
index f6f0917..493b1a3 100644
--- a/chrome/common/extensions/extension_error_reporter.cc
+++ b/chrome/common/extensions/extension_error_reporter.cc
@@ -21,8 +21,8 @@
// This is okay since the ExtensionErrorReporter is a singleton that lives until
// the end of the process.
template <> struct RunnableMethodTraits<ExtensionErrorReporter> {
- static void RetainCallee(ExtensionErrorReporter*) {}
- static void ReleaseCallee(ExtensionErrorReporter*) {}
+ void RetainCallee(ExtensionErrorReporter*) {}
+ void ReleaseCallee(ExtensionErrorReporter*) {}
};
ExtensionErrorReporter* ExtensionErrorReporter::instance_ = NULL;
diff --git a/chrome/test/in_process_browser_test.h b/chrome/test/in_process_browser_test.h
index 2f519b7..ace6e07 100644
--- a/chrome/test/in_process_browser_test.h
+++ b/chrome/test/in_process_browser_test.h
@@ -45,6 +45,7 @@ class InProcessBrowserTest : public testing::Test {
// We do this so we can be used in a Task.
void AddRef() {}
void Release() {}
+ static bool ImplementsThreadSafeReferenceCounting() { return false; }
// Configures everything for an in process browser test, then invokes
// BrowserMain. BrowserMain ends up invoking RunTestOnMainThreadLoop.
diff --git a/chrome/test/interactive_ui/view_event_test_base.h b/chrome/test/interactive_ui/view_event_test_base.h
index 1bb7bd0..456cefc 100644
--- a/chrome/test/interactive_ui/view_event_test_base.h
+++ b/chrome/test/interactive_ui/view_event_test_base.h
@@ -79,6 +79,7 @@ class ViewEventTestBase : public views::WindowDelegate,
// Overriden to do nothing so that this class can be used in runnable tasks.
void AddRef() {}
void Release() {}
+ static bool ImplementsThreadSafeReferenceCounting() { return false; }
protected:
// Returns the view that is added to the window.
diff --git a/chrome_frame/chrome_frame_automation.cc b/chrome_frame/chrome_frame_automation.cc
index 79c0c38..1f369b5 100644
--- a/chrome_frame/chrome_frame_automation.cc
+++ b/chrome_frame/chrome_frame_automation.cc
@@ -144,8 +144,8 @@ ProxyFactory::ProxyCacheEntry::ProxyCacheEntry(const std::wstring& profile)
}
template <> struct RunnableMethodTraits<ProxyFactory> {
- static void RetainCallee(ProxyFactory* obj) {}
- static void ReleaseCallee(ProxyFactory* obj) {}
+ void RetainCallee(ProxyFactory* obj) {}
+ void ReleaseCallee(ProxyFactory* obj) {}
};
ProxyFactory::ProxyFactory()
diff --git a/chrome_frame/chrome_frame_delegate.h b/chrome_frame/chrome_frame_delegate.h
index a3302da..ebde626 100644
--- a/chrome_frame/chrome_frame_delegate.h
+++ b/chrome_frame/chrome_frame_delegate.h
@@ -37,11 +37,8 @@ class ChromeFrameDelegate {
// Template specialization
template <> struct RunnableMethodTraits<ChromeFrameDelegate> {
- static void RetainCallee(ChromeFrameDelegate* obj) {
- }
-
- static void ReleaseCallee(ChromeFrameDelegate* obj) {
- }
+ void RetainCallee(ChromeFrameDelegate* obj) {}
+ void ReleaseCallee(ChromeFrameDelegate* obj) {}
};
extern UINT kAutomationServerReady;
diff --git a/chrome_frame/test/chrome_frame_unittests.cc b/chrome_frame/test/chrome_frame_unittests.cc
index 20826b1..d24f5b3 100644
--- a/chrome_frame/test/chrome_frame_unittests.cc
+++ b/chrome_frame/test/chrome_frame_unittests.cc
@@ -34,7 +34,7 @@ const wchar_t kDocRoot[] = L"chrome_frame\\test\\data";
const int kLongWaitTimeout = 60 * 1000;
const int kShortWaitTimeout = 25 * 1000;
-_ATL_FUNC_INFO WebBrowserEventSink::kNavigateErrorInfo = {
+_ATL_FUNC_INFO WebBrowserEventSink::kNavigateErrorInfo = {
CC_STDCALL, VT_EMPTY, 5, {
VT_DISPATCH,
VT_VARIANT | VT_BYREF,
@@ -51,7 +51,7 @@ _ATL_FUNC_INFO WebBrowserEventSink::kNavigateComplete2Info = {
}
};
-_ATL_FUNC_INFO WebBrowserEventSink::kBeforeNavigate2Info = {
+_ATL_FUNC_INFO WebBrowserEventSink::kBeforeNavigate2Info = {
CC_STDCALL, VT_EMPTY, 7, {
VT_DISPATCH,
VT_VARIANT | VT_BYREF,
@@ -797,7 +797,7 @@ class ChromeFrameTestEnvironment: public testing::Environment {
public:
~ChromeFrameTestEnvironment() {
}
-
+
void SetUp() {
ScopedChromeFrameRegistrar::RegisterDefaults();
}
@@ -806,7 +806,7 @@ class ChromeFrameTestEnvironment: public testing::Environment {
}
};
-::testing::Environment* const chrome_frame_env =
+::testing::Environment* const chrome_frame_env =
::testing::AddGlobalTestEnvironment(new ChromeFrameTestEnvironment);
// TODO(stoyan): - Move everything below in separate file(s).
@@ -988,18 +988,18 @@ struct MockAutomationMessageSender : public AutomationMessageSender {
};
template <> struct RunnableMethodTraits<ProxyFactory::LaunchDelegate> {
- static void RetainCallee(ProxyFactory::LaunchDelegate* obj) {}
- static void ReleaseCallee(ProxyFactory::LaunchDelegate* obj) {}
+ void RetainCallee(ProxyFactory::LaunchDelegate* obj) {}
+ void ReleaseCallee(ProxyFactory::LaunchDelegate* obj) {}
};
template <> struct RunnableMethodTraits<MockProxyFactory> {
- static void RetainCallee(MockProxyFactory* obj) {}
- static void ReleaseCallee(MockProxyFactory* obj) {}
+ void RetainCallee(MockProxyFactory* obj) {}
+ void ReleaseCallee(MockProxyFactory* obj) {}
};
template <> struct RunnableMethodTraits<ChromeFrameAutomationClient> {
- static void RetainCallee(ChromeFrameAutomationClient* obj) {}
- static void ReleaseCallee(ChromeFrameAutomationClient* obj) {}
+ void RetainCallee(ChromeFrameAutomationClient* obj) {}
+ void ReleaseCallee(ChromeFrameAutomationClient* obj) {}
};
// MessageLoopForUI wrapper that runs only for a limited time.
@@ -1019,8 +1019,8 @@ struct TimedMsgLoop {
};
template <> struct RunnableMethodTraits<TimedMsgLoop> {
- static void RetainCallee(TimedMsgLoop* obj) {}
- static void ReleaseCallee(TimedMsgLoop* obj) {}
+ void RetainCallee(TimedMsgLoop* obj) {}
+ void ReleaseCallee(TimedMsgLoop* obj) {}
};
// Saves typing. It's somewhat hard to create a wrapper around
diff --git a/ipc/ipc_logging.cc b/ipc/ipc_logging.cc
index 9d4f4bb..e1684d7 100644
--- a/ipc/ipc_logging.cc
+++ b/ipc/ipc_logging.cc
@@ -36,8 +36,8 @@ using base::Time;
// special retention program.
template <>
struct RunnableMethodTraits<IPC::Logging> {
- static void RetainCallee(IPC::Logging*) {}
- static void ReleaseCallee(IPC::Logging*) {}
+ void RetainCallee(IPC::Logging*) {}
+ void ReleaseCallee(IPC::Logging*) {}
};
namespace IPC {
diff --git a/ipc/ipc_sync_channel_unittest.cc b/ipc/ipc_sync_channel_unittest.cc
index f20f788..f6bf10e 100644
--- a/ipc/ipc_sync_channel_unittest.cc
+++ b/ipc/ipc_sync_channel_unittest.cc
@@ -66,6 +66,7 @@ class Worker : public Channel::Listener, public Message::Sender {
}
void AddRef() { }
void Release() { }
+ static bool ImplementsThreadSafeReferenceCounting() { return true; }
bool Send(Message* msg) { return channel_->Send(msg); }
bool SendWithTimeout(Message* msg, int timeout_ms) {
return channel_->SendWithTimeout(msg, timeout_ms);
diff --git a/net/proxy/proxy_config_service_linux_unittest.cc b/net/proxy/proxy_config_service_linux_unittest.cc
index 761b20a..26149e5 100644
--- a/net/proxy/proxy_config_service_linux_unittest.cc
+++ b/net/proxy/proxy_config_service_linux_unittest.cc
@@ -309,12 +309,11 @@ class SynchConfigGetter {
int get_config_result_; // Return value from GetProxyConfig().
};
-template<>
-void RunnableMethodTraits<SynchConfigGetter>::RetainCallee(
- SynchConfigGetter* remover) {}
-template<>
-void RunnableMethodTraits<SynchConfigGetter>::ReleaseCallee(
- SynchConfigGetter* remover) {}
+template <>
+struct RunnableMethodTraits<SynchConfigGetter> {
+ void RetainCallee(SynchConfigGetter*) {}
+ void ReleaseCallee(SynchConfigGetter*) {}
+};
namespace net {