
They were on the IO thread to avoid deadlocks with NPAPI plugins, but we don't have that anymore. Currently this is off by default behind a feature flag. I have tried to minimize the churn in the code to enable this. Some places where it would involve too much duplication or refactoring I've kept with PostTasks from UI to UI thread. Once this is enabled by default then I'll simplify all the callsites. Bug: 904556 Change-Id: Ib664d644e0af016d5736348218bcc38cb79341f8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2806425 Commit-Queue: John Abd-El-Malek <jam@chromium.org> Owners-Override: John Abd-El-Malek <jam@chromium.org> Reviewed-by: Kinuko Yasuda <kinuko@chromium.org> Cr-Commit-Position: refs/heads/master@{#870614}
101 lines
3.4 KiB
C++
101 lines
3.4 KiB
C++
// Copyright (c) 2012 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.
|
|
|
|
#ifndef CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_
|
|
#define CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_
|
|
|
|
#include <memory>
|
|
|
|
#include "base/macros.h"
|
|
#include "base/threading/thread.h"
|
|
#include "base/threading/thread_checker.h"
|
|
#include "build/build_config.h"
|
|
#include "content/common/content_export.h"
|
|
#include "content/public/browser/browser_thread.h"
|
|
|
|
#if defined(OS_WIN)
|
|
namespace base {
|
|
namespace win {
|
|
class ScopedCOMInitializer;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
namespace content {
|
|
class NotificationService;
|
|
}
|
|
|
|
namespace content {
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// A BrowserProcessSubThread is a physical thread backing a BrowserThread.
|
|
//
|
|
// Applications must initialize the COM library before they can call
|
|
// COM library functions other than CoGetMalloc and memory allocation
|
|
// functions, so this class initializes COM for those users.
|
|
class CONTENT_EXPORT BrowserProcessSubThread : public base::Thread {
|
|
public:
|
|
// Constructs a BrowserProcessSubThread for |identifier|.
|
|
explicit BrowserProcessSubThread(BrowserThread::ID identifier);
|
|
~BrowserProcessSubThread() override;
|
|
|
|
// Registers this thread to represent |identifier_| in the browser_thread.h
|
|
// API. This thread must already be running when this is called. This can only
|
|
// be called once per BrowserProcessSubThread instance.
|
|
void RegisterAsBrowserThread();
|
|
|
|
// Ideally there wouldn't be a special blanket allowance to block the
|
|
// BrowserThreads in tests but TestBrowserThreadImpl previously bypassed
|
|
// BrowserProcessSubThread and hence wasn't subject to ThreadRestrictions...
|
|
// Flipping that around in favor of explicit scoped allowances would be
|
|
// preferable but a non-trivial amount of work. Can only be called before
|
|
// starting this BrowserProcessSubThread.
|
|
void AllowBlockingForTesting();
|
|
|
|
protected:
|
|
void Init() override;
|
|
void Run(base::RunLoop* run_loop) override;
|
|
void CleanUp() override;
|
|
|
|
private:
|
|
// Second Init() phase that must happen on this thread but can only happen
|
|
// after it's promoted to a BrowserThread in |RegisterAsBrowserThread()|.
|
|
void CompleteInitializationOnBrowserThread();
|
|
|
|
// These methods merely forwards to Thread::Run() but are useful to identify
|
|
// which BrowserThread this represents in stack traces.
|
|
void UIThreadRun(base::RunLoop* run_loop);
|
|
void IOThreadRun(base::RunLoop* run_loop);
|
|
|
|
// This method encapsulates cleanup that needs to happen on the IO thread.
|
|
void IOThreadCleanUp();
|
|
|
|
void ProcessHostCleanUp();
|
|
|
|
const BrowserThread::ID identifier_;
|
|
|
|
// BrowserThreads are not allowed to do file I/O nor wait on synchronization
|
|
// primivives except when explicitly allowed in tests.
|
|
bool is_blocking_allowed_for_testing_ = false;
|
|
|
|
// The BrowserThread registration for this |identifier_|, initialized in
|
|
// RegisterAsBrowserThread().
|
|
std::unique_ptr<BrowserThreadImpl> browser_thread_;
|
|
|
|
#if defined (OS_WIN)
|
|
std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_;
|
|
#endif
|
|
|
|
// Each specialized thread has its own notification service.
|
|
std::unique_ptr<NotificationService> notification_service_;
|
|
|
|
THREAD_CHECKER(browser_thread_checker_);
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(BrowserProcessSubThread);
|
|
};
|
|
|
|
} // namespace content
|
|
|
|
#endif // CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_
|