| Index: base/message_loop/message_pump_mac.mm
|
| diff --git a/base/message_loop/message_pump_mac.mm b/base/message_loop/message_pump_mac.mm
|
| index f885fbf5f6bbb9d53fc1d24363c0f427699ace6c..3793ab85decf591bf13925aa1d06514f2f959a93 100644
|
| --- a/base/message_loop/message_pump_mac.mm
|
| +++ b/base/message_loop/message_pump_mac.mm
|
| @@ -8,6 +8,7 @@
|
|
|
| #include <limits>
|
|
|
| +#include "base/debug/trace_event.h"
|
| #include "base/logging.h"
|
| #include "base/run_loop.h"
|
| #include "base/time/time.h"
|
| @@ -101,7 +102,8 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
|
| CFRunLoopObserverContext observer_context = CFRunLoopObserverContext();
|
| observer_context.info = this;
|
| pre_wait_observer_ = CFRunLoopObserverCreate(NULL, // allocator
|
| - kCFRunLoopBeforeWaiting,
|
| + kCFRunLoopBeforeWaiting |
|
| + kCFRunLoopAfterWaiting,
|
| true, // repeat
|
| 0, // priority
|
| PreWaitObserver,
|
| @@ -226,6 +228,7 @@ void MessagePumpCFRunLoopBase::RunDelayedWorkTimer(CFRunLoopTimerRef timer,
|
| // Called from the run loop.
|
| // static
|
| void MessagePumpCFRunLoopBase::RunWorkSource(void* info) {
|
| + TRACE_EVENT0("CFRunLoop", "RunWorkSource");
|
| MessagePumpCFRunLoopBase* self = static_cast<MessagePumpCFRunLoopBase*>(info);
|
| self->RunWork();
|
| }
|
| @@ -285,6 +288,7 @@ bool MessagePumpCFRunLoopBase::RunWork() {
|
| // Called from the run loop.
|
| // static
|
| void MessagePumpCFRunLoopBase::RunIdleWorkSource(void* info) {
|
| + TRACE_EVENT0("CFRunLoop", "RunWorkIdleSource");
|
| MessagePumpCFRunLoopBase* self = static_cast<MessagePumpCFRunLoopBase*>(info);
|
| self->RunIdleWork();
|
| }
|
| @@ -319,6 +323,7 @@ bool MessagePumpCFRunLoopBase::RunIdleWork() {
|
| // Called from the run loop.
|
| // static
|
| void MessagePumpCFRunLoopBase::RunNestingDeferredWorkSource(void* info) {
|
| + TRACE_EVENT0("CFRunLoop", "RunNestingDeferredWorkSource");
|
| MessagePumpCFRunLoopBase* self = static_cast<MessagePumpCFRunLoopBase*>(info);
|
| self->RunNestingDeferredWork();
|
| }
|
| @@ -368,6 +373,18 @@ void MessagePumpCFRunLoopBase::PreWaitObserver(CFRunLoopObserverRef observer,
|
| void* info) {
|
| MessagePumpCFRunLoopBase* self = static_cast<MessagePumpCFRunLoopBase*>(info);
|
|
|
| + static uint32 last_id = 0;
|
| + if (activity == kCFRunLoopBeforeWaiting)
|
| + self->nesting_stack_.push(++last_id);
|
| + uint64_t trace_id = ((uintptr_t)observer << sizeof(uint32)) | self->nesting_stack_.top();
|
| + if (activity == kCFRunLoopAfterWaiting) {
|
| + TRACE_EVENT_ASYNC_END0("CFRunLoop", "Waiting", trace_id);
|
| + self->nesting_stack_.pop();
|
| + return;
|
| + } else {
|
| + TRACE_EVENT_ASYNC_BEGIN0("CFRunLoop", "Waiting", trace_id);
|
| + }
|
| +
|
| // Attempt to do some idle work before going to sleep.
|
| self->RunIdleWork();
|
|
|
| @@ -399,9 +416,16 @@ void MessagePumpCFRunLoopBase::EnterExitObserver(CFRunLoopObserverRef observer,
|
| CFRunLoopActivity activity,
|
| void* info) {
|
| MessagePumpCFRunLoopBase* self = static_cast<MessagePumpCFRunLoopBase*>(info);
|
| + static uint32 last_id = 0;
|
| +
|
| + if (activity == kCFRunLoopEntry)
|
| + self->nesting_stack_.push(++last_id);
|
| +
|
| + uint64_t trace_id = ((uintptr_t)observer << sizeof(uint32)) | self->nesting_stack_.top();
|
|
|
| switch (activity) {
|
| case kCFRunLoopEntry:
|
| + TRACE_EVENT_ASYNC_BEGIN0("CFRunLoop", "LoopCycle", trace_id);
|
| ++self->nesting_level_;
|
| if (self->nesting_level_ > self->deepest_nesting_level_) {
|
| self->deepest_nesting_level_ = self->nesting_level_;
|
| @@ -427,6 +451,8 @@ void MessagePumpCFRunLoopBase::EnterExitObserver(CFRunLoopObserverRef observer,
|
| // loop.
|
| self->MaybeScheduleNestingDeferredWork();
|
| --self->nesting_level_;
|
| + TRACE_EVENT_ASYNC_END0("CFRunLoop", "LoopCycle", trace_id);
|
| + self->nesting_stack_.pop();
|
| break;
|
|
|
| default:
|
| @@ -461,6 +487,7 @@ void MessagePumpCFRunLoop::DoRun(Delegate* delegate) {
|
| // pool management is introduced.
|
| int result;
|
| do {
|
| + TRACE_EVENT0("CFRunLoop", "DoRun");
|
| MessagePumpScopedAutoreleasePool autorelease_pool(this);
|
| result = CFRunLoopRunInMode(kCFRunLoopDefaultMode,
|
| kCFTimeIntervalMax,
|
| @@ -515,6 +542,7 @@ MessagePumpNSRunLoop::~MessagePumpNSRunLoop() {
|
|
|
| void MessagePumpNSRunLoop::DoRun(Delegate* delegate) {
|
| while (keep_running_) {
|
| + TRACE_EVENT0("NSRunLoop", "DoRun");
|
| // NSRunLoop manages autorelease pools itself.
|
| [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
|
| beforeDate:[NSDate distantFuture]];
|
| @@ -578,6 +606,7 @@ void MessagePumpNSApplication::DoRun(Delegate* delegate) {
|
| running_own_loop_ = true;
|
| NSDate* distant_future = [NSDate distantFuture];
|
| while (keep_running_) {
|
| + TRACE_EVENT0("NSApplication", "DoRun");
|
| MessagePumpScopedAutoreleasePool autorelease_pool(this);
|
| NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
| untilDate:distant_future
|
|
|