Index: mojo/common/message_pump_mojo.cc |
diff --git a/mojo/common/message_pump_mojo.cc b/mojo/common/message_pump_mojo.cc |
index 6d21af2123834c1ab5ed77a7dfd00a7ecc37e38a..c06927015945f36ba451498a8df9c5639a2ebd95 100644 |
--- a/mojo/common/message_pump_mojo.cc |
+++ b/mojo/common/message_pump_mojo.cc |
@@ -97,6 +97,14 @@ void MessagePumpMojo::RemoveHandler(const Handle& handle) { |
handlers_.erase(handle); |
} |
+void MessagePumpMojo::AddObserver(Observer* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void MessagePumpMojo::RemoveObserver(Observer* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
void MessagePumpMojo::Run(Delegate* delegate) { |
RunState run_state; |
// TODO: better deal with error handling. |
@@ -175,8 +183,10 @@ bool MessagePumpMojo::DoInternalWork(const RunState& run_state, bool block) { |
} else if (result > 0) { |
const size_t index = static_cast<size_t>(result); |
DCHECK(handlers_.find(wait_state.handles[index]) != handlers_.end()); |
+ WillSignalHandler(); |
handlers_[wait_state.handles[index]].handler->OnHandleReady( |
wait_state.handles[index]); |
+ DidSignalHandler(); |
} else { |
switch (result) { |
case MOJO_RESULT_CANCELLED: |
@@ -204,7 +214,9 @@ bool MessagePumpMojo::DoInternalWork(const RunState& run_state, bool block) { |
if (!i->second.deadline.is_null() && i->second.deadline < now && |
handlers_.find(i->first) != handlers_.end() && |
handlers_[i->first].id == i->second.id) { |
+ WillSignalHandler(); |
i->second.handler->OnHandleError(i->first, MOJO_RESULT_DEADLINE_EXCEEDED); |
+ DidSignalHandler(); |
handlers_.erase(i->first); |
did_work = true; |
} |
@@ -232,7 +244,9 @@ void MessagePumpMojo::RemoveFirstInvalidHandle(const WaitState& wait_state) { |
MessagePumpMojoHandler* handler = |
handlers_[wait_state.handles[i]].handler; |
handlers_.erase(wait_state.handles[i]); |
+ WillSignalHandler(); |
handler->OnHandleError(wait_state.handles[i], result); |
+ DidSignalHandler(); |
return; |
} |
} |
@@ -274,5 +288,13 @@ MojoDeadline MessagePumpMojo::GetDeadlineForWait( |
return deadline; |
} |
+void MessagePumpMojo::WillSignalHandler() { |
+ FOR_EACH_OBSERVER(Observer, observers_, WillSignalHandler()); |
+} |
+ |
+void MessagePumpMojo::DidSignalHandler() { |
+ FOR_EACH_OBSERVER(Observer, observers_, DidSignalHandler()); |
+} |
+ |
} // namespace common |
} // namespace mojo |