OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_BROWSER_THREAD_H_ | 5 #ifndef CHROME_BROWSER_BROWSER_THREAD_H_ |
6 #define CHROME_BROWSER_BROWSER_THREAD_H_ | 6 #define CHROME_BROWSER_BROWSER_THREAD_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include "base/lock.h" | 9 #include "base/lock.h" |
10 #include "base/task.h" | 10 #include "base/task.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 Task* task); | 102 Task* task); |
103 static bool PostNonNestableDelayedTask( | 103 static bool PostNonNestableDelayedTask( |
104 ID identifier, | 104 ID identifier, |
105 const tracked_objects::Location& from_here, | 105 const tracked_objects::Location& from_here, |
106 Task* task, | 106 Task* task, |
107 int64 delay_ms); | 107 int64 delay_ms); |
108 | 108 |
109 template <class T> | 109 template <class T> |
110 static bool DeleteSoon(ID identifier, | 110 static bool DeleteSoon(ID identifier, |
111 const tracked_objects::Location& from_here, | 111 const tracked_objects::Location& from_here, |
112 T* object) { | 112 const T* object) { |
113 return PostNonNestableTask( | 113 return PostNonNestableTask( |
114 identifier, from_here, new DeleteTask<T>(object)); | 114 identifier, from_here, new DeleteTask<T>(object)); |
115 } | 115 } |
116 | 116 |
117 template <class T> | 117 template <class T> |
118 static bool ReleaseSoon(ID identifier, | 118 static bool ReleaseSoon(ID identifier, |
119 const tracked_objects::Location& from_here, | 119 const tracked_objects::Location& from_here, |
120 T* object) { | 120 const T* object) { |
121 return PostNonNestableTask( | 121 return PostNonNestableTask( |
122 identifier, from_here, new ReleaseTask<T>(object)); | 122 identifier, from_here, new ReleaseTask<T>(object)); |
123 } | 123 } |
124 | 124 |
125 // Callable on any thread. Returns whether the given ID corresponds to a well | 125 // Callable on any thread. Returns whether the given ID corresponds to a well |
126 // known thread. | 126 // known thread. |
127 static bool IsWellKnownThread(ID identifier); | 127 static bool IsWellKnownThread(ID identifier); |
128 | 128 |
129 // Callable on any thread. Returns whether you're currently on a particular | 129 // Callable on any thread. Returns whether you're currently on a particular |
130 // thread. | 130 // thread. |
(...skipping 16 matching lines...) Expand all Loading... |
147 // Use these templates in conjuction with RefCountedThreadSafe when you want | 147 // Use these templates in conjuction with RefCountedThreadSafe when you want |
148 // to ensure that an object is deleted on a specific thread. This is needed | 148 // to ensure that an object is deleted on a specific thread. This is needed |
149 // when an object can hop between threads (i.e. IO -> FILE -> IO), and thread | 149 // when an object can hop between threads (i.e. IO -> FILE -> IO), and thread |
150 // switching delays can mean that the final IO tasks executes before the FILE | 150 // switching delays can mean that the final IO tasks executes before the FILE |
151 // task's stack unwinds. This would lead to the object destructing on the | 151 // task's stack unwinds. This would lead to the object destructing on the |
152 // FILE thread, which often is not what you want (i.e. to unregister from | 152 // FILE thread, which often is not what you want (i.e. to unregister from |
153 // NotificationService, to notify other objects on the creating thread etc). | 153 // NotificationService, to notify other objects on the creating thread etc). |
154 template<ID thread> | 154 template<ID thread> |
155 struct DeleteOnThread { | 155 struct DeleteOnThread { |
156 template<typename T> | 156 template<typename T> |
157 static void Destruct(T* x) { | 157 static void Destruct(const T* x) { |
158 if (CurrentlyOn(thread)) { | 158 if (CurrentlyOn(thread)) { |
159 delete x; | 159 delete x; |
160 } else { | 160 } else { |
161 DeleteSoon(thread, FROM_HERE, x); | 161 DeleteSoon(thread, FROM_HERE, x); |
162 } | 162 } |
163 } | 163 } |
164 }; | 164 }; |
165 | 165 |
166 // Sample usage: | 166 // Sample usage: |
167 // class Foo | 167 // class Foo |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 static Lock lock_; | 200 static Lock lock_; |
201 | 201 |
202 // An array of the BrowserThread objects. This array is protected by |lock_|. | 202 // An array of the BrowserThread objects. This array is protected by |lock_|. |
203 // The threads are not owned by this array. Typically, the threads are owned | 203 // The threads are not owned by this array. Typically, the threads are owned |
204 // on the UI thread by the g_browser_process object. BrowserThreads remove | 204 // on the UI thread by the g_browser_process object. BrowserThreads remove |
205 // themselves from this array upon destruction. | 205 // themselves from this array upon destruction. |
206 static BrowserThread* browser_threads_[ID_COUNT]; | 206 static BrowserThread* browser_threads_[ID_COUNT]; |
207 }; | 207 }; |
208 | 208 |
209 #endif // CHROME_BROWSER_BROWSER_THREAD_H_ | 209 #endif // CHROME_BROWSER_BROWSER_THREAD_H_ |
OLD | NEW |