Index: ipc/ipc_sync_message.cc |
diff --git a/ipc/ipc_sync_message.cc b/ipc/ipc_sync_message.cc |
index ba87de8f22e0b7a426da046b0e36d238ad028c7d..7f9df7bd9bc0187ace28d3595381c431e00b635b 100644 |
--- a/ipc/ipc_sync_message.cc |
+++ b/ipc/ipc_sync_message.cc |
@@ -9,10 +9,25 @@ |
#include <stack> |
#include "base/atomic_sequence_num.h" |
+#include "base/lazy_instance.h" |
#include "base/logging.h" |
+#include "base/synchronization/waitable_event.h" |
#include "build/build_config.h" |
namespace { |
+ |
+struct WaitableEventLazyInstanceTraits |
+ : public base::DefaultLazyInstanceTraits<base::WaitableEvent> { |
+ static base::WaitableEvent* New(void* instance) { |
+ // Use placement new to initialize our instance in our preallocated space. |
+ return new (instance) |
+ base::WaitableEvent(base::WaitableEvent::ResetPolicy::MANUAL, |
+ base::WaitableEvent::InitialState::SIGNALED); |
+ } |
+}; |
+ |
+base::LazyInstance<base::WaitableEvent, WaitableEventLazyInstanceTraits> |
+ dummy_event = LAZY_INSTANCE_INITIALIZER; |
base::StaticAtomicSequenceNumber g_next_id; |
@@ -27,7 +42,8 @@ |
PriorityValue priority, |
MessageReplyDeserializer* deserializer) |
: Message(routing_id, type, priority), |
- deserializer_(deserializer) { |
+ deserializer_(deserializer), |
+ pump_messages_event_(NULL) { |
set_sync(); |
set_unblock(true); |
@@ -43,6 +59,11 @@ |
MessageReplyDeserializer* SyncMessage::GetReplyDeserializer() { |
DCHECK(deserializer_.get()); |
return deserializer_.release(); |
+} |
+ |
+void SyncMessage::EnableMessagePumping() { |
+ DCHECK(!pump_messages_event_); |
+ set_pump_messages_event(dummy_event.Pointer()); |
} |
bool SyncMessage::IsMessageReplyTo(const Message& msg, int request_id) { |