// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_WEB_PUBLIC_THREAD_WEB_THREAD_H_
#define IOS_WEB_PUBLIC_THREAD_WEB_THREAD_H_
#include <memory>
#include <string>
#include <utility>
#include "base/check_op.h"
#include "base/task/single_thread_task_runner.h"
namespace web {
// TODO(crbug.com/40108370): Include web_task_traits.h directly when the
// migration to Get(UI|IO)ThreadTaskrunner() is complete and the cyclic
// dependency of web_task_traits.h on WebThread::ID is broken.
class WebTaskTraits;
class WebThreadDelegate;
// Use DCHECK_CURRENTLY_ON(WebThread::ID) to assert that a function can only be
// called on the named WebThread.
#define DCHECK_CURRENTLY_ON(thread_identifier) \
DCHECK(::web::WebThread::CurrentlyOn(thread_identifier)) \
<< ::web::WebThread::GetCurrentlyOnErrorMessage(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 WebTaskEnvironment in scope for this API to be
// available.
//
// TODO(crbug.com/40108370): Make default traits |{}| the default param when
// it's possible to include web_task_traits.h in this file (see note above on
// the WebTaskTraits fwd-decl).
scoped_refptr<base::SingleThreadTaskRunner> GetUIThreadTaskRunner(
const WebTaskTraits& traits);
// The WebThread::IO counterpart to GetUIThreadTaskRunner().
scoped_refptr<base::SingleThreadTaskRunner> GetIOThreadTaskRunner(
const WebTaskTraits& traits);
///////////////////////////////////////////////////////////////////////////////
// WebThread
//
// Utility functions for threads that are known by name.
class WebThread {
public:
// An enumeration of the well-known threads.
enum ID {
// The main thread in the browser. It stops running tasks during shutdown
// and is never joined.
UI,
// This is the thread that processes non-blocking I/O, i.e. IPC and network.
// Blocking I/O should happen in base::ThreadPool. It is joined on shutdown
// (and thus any task posted to it may block shutdown).
IO,
// NOTE: do not add new threads here. Instead you should just use
// base::ThreadPool::Create*TaskRunner to run tasks on the base::ThreadPool.
// This identifier does not represent a thread. Instead it counts the
// number of well-known threads. Insert new well-known threads before this
// identifier.
ID_COUNT
};
WebThread(const WebThread&) = delete;
WebThread& operator=(const WebThread&) = delete;
// Callable on any thread. Returns whether the given well-known thread is
// initialized.
[[nodiscard]] static bool IsThreadInitialized(ID identifier);
// Callable on any thread. Returns whether execution is currently on the
// given thread. To DCHECK this, use the DCHECK_CURRENTLY_ON() macro above.
[[nodiscard]] static bool CurrentlyOn(ID identifier);
// If the current message loop is one of the known threads, returns true and
// sets identifier to its ID.
[[nodiscard]] static bool GetCurrentThreadIdentifier(ID* identifier);
// Sets the delegate for WebThread::IO.
//
// This only supports the IO thread.
//
// Only one delegate may be registered at a time. Delegates may be
// unregistered by providing a nullptr pointer.
//
// The delegate can only be registered through this call before
// WebThreadImpl(WebThread::IO) is created and unregistered after
// it was destroyed and its underlying thread shutdown.
static void SetIOThreadDelegate(WebThreadDelegate* delegate);
// Returns an appropriate error message for when DCHECK_CURRENTLY_ON() fails.
static std::string GetCurrentlyOnErrorMessage(ID expected);
private:
friend class WebThreadImpl;
friend class ContentThreadImpl;
WebThread() = default;
};
} // namespace web
#endif // IOS_WEB_PUBLIC_THREAD_WEB_THREAD_H_