summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_thread.h
diff options
context:
space:
mode:
authortfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-12 23:23:44 +0000
committertfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-12 23:23:44 +0000
commit092b04eff58cf2d20b6d7e6da0844c8bc5a798fb (patch)
tree20add3b04716381191280756bb8090ced27d4204 /chrome/browser/browser_thread.h
parent1dfd7ad41fcfccf7525f52755d798278286dec1e (diff)
downloadchromium_src-092b04eff58cf2d20b6d7e6da0844c8bc5a798fb.zip
chromium_src-092b04eff58cf2d20b6d7e6da0844c8bc5a798fb.tar.gz
chromium_src-092b04eff58cf2d20b6d7e6da0844c8bc5a798fb.tar.bz2
Rename ChromeThread to BrowserThread Final Part:
- Rename chrome_thread.cc to browser_thread.cc - Rename chrome_thread_unittest.cc to browser_thread_unittest.cc - Include browser_thread.h instead of chrome_thread.h where needed. - Fix gyp files according. BUG=56926 TEST=trybots and compiled locally Review URL: http://codereview.chromium.org/3643005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62356 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_thread.h')
-rw-r--r--chrome/browser/browser_thread.h201
1 files changed, 200 insertions, 1 deletions
diff --git a/chrome/browser/browser_thread.h b/chrome/browser/browser_thread.h
index fdaf997..c034851 100644
--- a/chrome/browser/browser_thread.h
+++ b/chrome/browser/browser_thread.h
@@ -4,7 +4,206 @@
#ifndef CHROME_BROWSER_BROWSER_THREAD_H_
#define CHROME_BROWSER_BROWSER_THREAD_H_
+#pragma once
-#include "chrome/browser/chrome_thread.h"
+#include "base/lock.h"
+#include "base/task.h"
+#include "base/thread.h"
+
+namespace base {
+class MessageLoopProxy;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// BrowserThread
+//
+// This class represents a thread that is known by a browser-wide name. For
+// example, there is one IO thread for the entire browser process, and various
+// pieces of code find it useful to retrieve a pointer to the IO thread's
+// Invoke a task by thread ID:
+//
+// BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task);
+//
+// The return value is false if the task couldn't be posted because the target
+// thread doesn't exist. If this could lead to data loss, you need to check the
+// result and restructure the code to ensure it doesn't occur.
+//
+// This class automatically handles the lifetime of different threads.
+// It's always safe to call PostTask on any thread. If it's not yet created,
+// the task is deleted. There are no race conditions. If the thread that the
+// task is posted to is guaranteed to outlive the current thread, then no locks
+// are used. You should never need to cache pointers to MessageLoops, since
+// they're not thread safe.
+class BrowserThread : public base::Thread {
+ public:
+ // An enumeration of the well-known threads.
+ // NOTE: threads must be listed in the order of their life-time, with each
+ // thread outliving every other thread below it.
+ enum ID {
+ // The main thread in the browser.
+ UI,
+
+ // This is the thread that interacts with the database.
+ DB,
+
+ // This is the "main" thread for WebKit within the browser process when
+ // NOT in --single-process mode.
+ WEBKIT,
+
+ // This is the thread that interacts with the file system.
+ FILE,
+
+ // Used to launch and terminate processes.
+ PROCESS_LAUNCHER,
+
+ // This is the thread to handle slow HTTP cache operations.
+ CACHE,
+
+ // This is the thread that processes IPC and network messages.
+ IO,
+
+#if defined(USE_X11)
+ // This thread has a second connection to the X server and is used to
+ // process UI requests when routing the request to the UI thread would risk
+ // deadlock.
+ BACKGROUND_X11,
+#endif
+
+ // 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
+ };
+
+ // Construct a BrowserThread with the supplied identifier. It is an error
+ // to construct a BrowserThread that already exists.
+ explicit BrowserThread(ID identifier);
+
+ // Special constructor for the main (UI) thread and unittests. We use a dummy
+ // thread here since the main thread already exists.
+ BrowserThread(ID identifier, MessageLoop* message_loop);
+
+ virtual ~BrowserThread();
+
+ // These are the same methods in message_loop.h, but are guaranteed to either
+ // get posted to the MessageLoop if it's still alive, or be deleted otherwise.
+ // They return true iff the thread existed and the task was posted. Note that
+ // even if the task is posted, there's no guarantee that it will run, since
+ // the target thread may already have a Quit message in its queue.
+ static bool PostTask(ID identifier,
+ const tracked_objects::Location& from_here,
+ Task* task);
+ static bool PostDelayedTask(ID identifier,
+ const tracked_objects::Location& from_here,
+ Task* task,
+ int64 delay_ms);
+ static bool PostNonNestableTask(ID identifier,
+ const tracked_objects::Location& from_here,
+ Task* task);
+ static bool PostNonNestableDelayedTask(
+ ID identifier,
+ const tracked_objects::Location& from_here,
+ Task* task,
+ int64 delay_ms);
+
+ template <class T>
+ static bool DeleteSoon(ID identifier,
+ const tracked_objects::Location& from_here,
+ T* object) {
+ return PostNonNestableTask(
+ identifier, from_here, new DeleteTask<T>(object));
+ }
+
+ template <class T>
+ static bool ReleaseSoon(ID identifier,
+ const tracked_objects::Location& from_here,
+ T* object) {
+ return PostNonNestableTask(
+ identifier, from_here, new ReleaseTask<T>(object));
+ }
+
+ // Callable on any thread. Returns whether the given ID corresponds to a well
+ // known thread.
+ static bool IsWellKnownThread(ID identifier);
+
+ // Callable on any thread. Returns whether you're currently on a particular
+ // thread.
+ static bool CurrentlyOn(ID identifier);
+
+ // Callable on any thread. Returns whether the threads message loop is valid.
+ // If this returns false it means the thread is in the process of shutting
+ // down.
+ static bool IsMessageLoopValid(ID identifier);
+
+ // If the current message loop is one of the known threads, returns true and
+ // sets identifier to its ID. Otherwise returns false.
+ static bool GetCurrentThreadIdentifier(ID* identifier);
+
+ // Callers can hold on to a refcounted MessageLoopProxy beyond the lifetime
+ // of the thread.
+ static scoped_refptr<base::MessageLoopProxy> GetMessageLoopProxyForThread(
+ ID identifier);
+
+ // Use these templates in conjuction with RefCountedThreadSafe when you want
+ // to ensure that an object is deleted on a specific thread. This is needed
+ // when an object can hop between threads (i.e. IO -> FILE -> IO), and thread
+ // switching delays can mean that the final IO tasks executes before the FILE
+ // task's stack unwinds. This would lead to the object destructing on the
+ // FILE thread, which often is not what you want (i.e. to unregister from
+ // NotificationService, to notify other objects on the creating thread etc).
+ template<ID thread>
+ struct DeleteOnThread {
+ template<typename T>
+ static void Destruct(T* x) {
+ if (CurrentlyOn(thread)) {
+ delete x;
+ } else {
+ DeleteSoon(thread, FROM_HERE, x);
+ }
+ }
+ };
+
+ // Sample usage:
+ // class Foo
+ // : public base::RefCountedThreadSafe<
+ // Foo, BrowserThread::DeleteOnIOThread> {
+ //
+ // ...
+ // private:
+ // friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
+ // friend class DeleteTask<Foo>;
+ //
+ // ~Foo();
+ struct DeleteOnUIThread : public DeleteOnThread<UI> { };
+ struct DeleteOnIOThread : public DeleteOnThread<IO> { };
+ struct DeleteOnFileThread : public DeleteOnThread<FILE> { };
+ struct DeleteOnDBThread : public DeleteOnThread<DB> { };
+ struct DeleteOnWebKitThread : public DeleteOnThread<WEBKIT> { };
+
+ private:
+ // Common initialization code for the constructors.
+ void Initialize();
+
+ static bool PostTaskHelper(
+ ID identifier,
+ const tracked_objects::Location& from_here,
+ Task* task,
+ int64 delay_ms,
+ bool nestable);
+
+ // The identifier of this thread. Only one thread can exist with a given
+ // identifier at a given time.
+ ID identifier_;
+
+ // This lock protects |browser_threads_|. Do not read or modify that array
+ // without holding this lock. Do not block while holding this lock.
+ static Lock lock_;
+
+ // An array of the BrowserThread objects. This array is protected by |lock_|.
+ // The threads are not owned by this array. Typically, the threads are owned
+ // on the UI thread by the g_browser_process object. BrowserThreads remove
+ // themselves from this array upon destruction.
+ static BrowserThread* browser_threads_[ID_COUNT];
+};
#endif // CHROME_BROWSER_BROWSER_THREAD_H_