diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-28 18:12:55 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-28 18:12:55 +0000 |
commit | 13f383ff5fc8ff095501794d4ce758f0067ff9b5 (patch) | |
tree | ceb1d08f38759bf8805ede009924a990bae496e5 | |
parent | f61f331824ac9c98684a886be0d918aefe69d3ce (diff) | |
download | chromium_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
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 { |