OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 BASE_MESSAGE_LOOP_H_ | 5 #ifndef BASE_MESSAGE_LOOP_H_ |
6 #define BASE_MESSAGE_LOOP_H_ | 6 #define BASE_MESSAGE_LOOP_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <queue> | 9 #include <queue> |
10 #include <string> | 10 #include <string> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/histogram.h" | 13 #include "base/histogram.h" |
14 #include "base/message_pump.h" | 14 #include "base/message_pump.h" |
15 #include "base/observer_list.h" | 15 #include "base/observer_list.h" |
16 #include "base/ref_counted.h" | 16 #include "base/ref_counted.h" |
17 #include "base/task.h" | 17 #include "base/task.h" |
18 #include "base/timer.h" | 18 #include "base/timer.h" |
19 #include "base/thread_local_storage.h" | |
20 | 19 |
21 #if defined(OS_WIN) | 20 #if defined(OS_WIN) |
22 // We need this to declare base::MessagePumpWin::Dispatcher, which we should | 21 // We need this to declare base::MessagePumpWin::Dispatcher, which we should |
23 // really just eliminate. | 22 // really just eliminate. |
24 #include "base/message_pump_win.h" | 23 #include "base/message_pump_win.h" |
25 #endif | 24 #endif |
26 | 25 |
27 // A MessageLoop is used to process events for a particular thread. There is | 26 // A MessageLoop is used to process events for a particular thread. There is |
28 // at most one MessageLoop instance per thread. | 27 // at most one MessageLoop instance per thread. |
29 // | 28 // |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 Type type() const { return type_; } | 193 Type type() const { return type_; } |
195 | 194 |
196 // Optional call to connect the thread name with this loop. | 195 // Optional call to connect the thread name with this loop. |
197 void set_thread_name(const std::string& thread_name) { | 196 void set_thread_name(const std::string& thread_name) { |
198 DCHECK(thread_name_.empty()) << "Should not rename this thread!"; | 197 DCHECK(thread_name_.empty()) << "Should not rename this thread!"; |
199 thread_name_ = thread_name; | 198 thread_name_ = thread_name; |
200 } | 199 } |
201 const std::string& thread_name() const { return thread_name_; } | 200 const std::string& thread_name() const { return thread_name_; } |
202 | 201 |
203 // Returns the MessageLoop object for the current thread, or null if none. | 202 // Returns the MessageLoop object for the current thread, or null if none. |
204 static MessageLoop* current() { | 203 static MessageLoop* current(); |
205 MessageLoop* loop = static_cast<MessageLoop*>(tls_index_.Get()); | |
206 // TODO(darin): sadly, we cannot enable this yet since people call us even | |
207 // when they have no intention of using us. | |
208 //DCHECK(loop) << "Ouch, did you forget to initialize me?"; | |
209 return loop; | |
210 } | |
211 | 204 |
212 // Enables or disables the recursive task processing. This happens in the case | 205 // Enables or disables the recursive task processing. This happens in the case |
213 // of recursive message loops. Some unwanted message loop may occurs when | 206 // of recursive message loops. Some unwanted message loop may occurs when |
214 // using common controls or printer functions. By default, recursive task | 207 // using common controls or printer functions. By default, recursive task |
215 // processing is disabled. | 208 // processing is disabled. |
216 // | 209 // |
217 // The specific case where tasks get queued is: | 210 // The specific case where tasks get queued is: |
218 // - The thread is running a message loop. | 211 // - The thread is running a message loop. |
219 // - It receives a task #1 and execute it. | 212 // - It receives a task #1 and execute it. |
220 // - The task #1 implicitly start a message loop, like a MessageBox in the | 213 // - The task #1 implicitly start a message loop, like a MessageBox in the |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 | 329 |
337 // Start recording histogram info about events and action IF it was enabled | 330 // Start recording histogram info about events and action IF it was enabled |
338 // and IF the statistics recorder can accept a registration of our histogram. | 331 // and IF the statistics recorder can accept a registration of our histogram. |
339 void StartHistogrammer(); | 332 void StartHistogrammer(); |
340 | 333 |
341 // Add occurence of event to our histogram, so that we can see what is being | 334 // Add occurence of event to our histogram, so that we can see what is being |
342 // done in a specific MessageLoop instance (i.e., specific thread). | 335 // done in a specific MessageLoop instance (i.e., specific thread). |
343 // If message_histogram_ is NULL, this is a no-op. | 336 // If message_histogram_ is NULL, this is a no-op. |
344 void HistogramEvent(int event); | 337 void HistogramEvent(int event); |
345 | 338 |
346 static TLSSlot tls_index_; | |
347 static const LinearHistogram::DescriptionPair event_descriptions_[]; | 339 static const LinearHistogram::DescriptionPair event_descriptions_[]; |
348 static bool enable_histogrammer_; | 340 static bool enable_histogrammer_; |
349 | 341 |
350 Type type_; | 342 Type type_; |
351 | 343 |
352 // A list of tasks that need to be processed by this instance. Note that | 344 // A list of tasks that need to be processed by this instance. Note that |
353 // this queue is only accessed (push/pop) by our current thread. | 345 // this queue is only accessed (push/pop) by our current thread. |
354 TaskQueue work_queue_; | 346 TaskQueue work_queue_; |
355 | 347 |
356 // Contains delayed tasks, sorted by their 'delayed_run_time' property. | 348 // Contains delayed tasks, sorted by their 'delayed_run_time' property. |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 #endif // defined(OS_WIN) | 448 #endif // defined(OS_WIN) |
457 }; | 449 }; |
458 | 450 |
459 // Do not add any member variables to MessageLoopForIO! This is important b/c | 451 // Do not add any member variables to MessageLoopForIO! This is important b/c |
460 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra | 452 // MessageLoopForIO is often allocated via MessageLoop(TYPE_IO). Any extra |
461 // data that you need should be stored on the MessageLoop's pump_ instance. | 453 // data that you need should be stored on the MessageLoop's pump_ instance. |
462 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), | 454 COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForIO), |
463 MessageLoopForIO_should_not_have_extra_member_variables); | 455 MessageLoopForIO_should_not_have_extra_member_variables); |
464 | 456 |
465 #endif // BASE_MESSAGE_LOOP_H_ | 457 #endif // BASE_MESSAGE_LOOP_H_ |
OLD | NEW |