// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_PUBLIC_BROWSER_BROWSER_THREAD_H_ #define CONTENT_PUBLIC_BROWSER_BROWSER_THREAD_H_ #include <memory> #include <string> #include <utility> #include "base/check.h" #include "base/functional/callback.h" #include "base/location.h" #include "base/macros/uniquify.h" #include "base/memory/scoped_refptr.h" #include "base/task/single_thread_task_runner.h" #include "base/thread_annotations.h" #include "content/common/content_export.h" #include "content/public/browser/browser_task_traits.h" #if defined(UNIT_TEST) #include "base/logging.h" #endif namespace content { // Use DCHECK_CURRENTLY_ON(BrowserThread::ID) to DCHECK that a function can only // be called on the named BrowserThread. #define DCHECK_CURRENTLY_ON(thread_identifier) … // Use CHECK_CURRENTLY_ON(BrowserThread::ID) to CHECK that a function can only // be called on the named BrowserThread. #define CHECK_CURRENTLY_ON(thread_identifier, ...) … // GUARDED_BY_BROWSER_THREAD() enforces that a member variable is only accessed // from a scope that invokes DCHECK_CURRENTLY_ON() or CHECK_CURRENTLY_ON() or // from a function annotated with VALID_BROWSER_THREAD_REQUIRED(). The code will // not compile if the member variable is accessed and these conditions are not // met. #define GUARDED_BY_BROWSER_THREAD(thread_identifier) … // VALID_CONTEXT_REQUIRED() enforces that a member function is only accessed // from a scope that invokes DCHECK_CURRENTLY_ON() or CHECK_CURRENTLY_ON() or // from another function annotated with VALID_BROWSER_THREAD_REQUIRED(). The // code will not compile if the member function is accessed and these conditions // are not met. #define VALID_BROWSER_THREAD_REQUIRED(thread_identifier) … // The main entry point to post tasks to the UI thread. Tasks posted with the // same |traits| will run in posting order (i.e. according to the // SequencedTaskRunner contract). Tasks posted with different |traits| can be // re-ordered. You may keep a reference to this task runner, it's always // thread-safe to post to it though it may start returning false at some point // during shutdown when it definitely is no longer accepting tasks. // // In unit tests, there must be a content::BrowserTaskEnvironment in scope for // this API to be available. CONTENT_EXPORT scoped_refptr<base::SingleThreadTaskRunner> GetUIThreadTaskRunner(const BrowserTaskTraits& traits = { … }; // The BrowserThread::IO counterpart to GetUIThreadTaskRunner(). CONTENT_EXPORT scoped_refptr<base::SingleThreadTaskRunner> GetIOThreadTaskRunner(const BrowserTaskTraits& traits = { … }; /////////////////////////////////////////////////////////////////////////////// // BrowserThread // // Utility functions for threads that are known by a browser-wide name. class CONTENT_EXPORT BrowserThread { … }; namespace internal { class THREAD_ANNOTATION_ATTRIBUTE__(capability("BrowserThread checker")) CONTENT_EXPORT BrowserThreadChecker { … }; // Returns the global BrowserThreadChecker associated with `thread_identifier`. CONTENT_EXPORT const BrowserThreadChecker& GetBrowserThreadChecker( BrowserThread::ID thread_identifier); // CHECK version. class CONTENT_EXPORT SCOPED_LOCKABLE ScopedValidateBrowserThreadChecker { … }; // DCHECK version. // Note: When DCHECKs are disabled, this class needs to be completely optimized // out in order to not regress binary size. This is achieved by inlining the // constructor and the destructor. When DCHECKs are enabled, the constructor // is not unnecessarily inlined. class CONTENT_EXPORT SCOPED_LOCKABLE ScopedValidateBrowserThreadDebugChecker { … }; } // namespace internal } // namespace content #endif // CONTENT_PUBLIC_BROWSER_BROWSER_THREAD_H_