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
3 // found in the LICENSE file.
5 #include "build/build_config.h"
12 #include "base/atomic_sequence_num.h"
13 //#include "base/logging.h"
15 #include "base/synchronization/waitable_event.h"
16 #include "ipc/ipc_sync_message.h"
20 #define kSyncMessageHeaderSize 4
22 static base::AtomicSequenceNumber g_next_id(base::LINKER_INITIALIZED);
24 static base::WaitableEvent* dummy_event = NULL; //new base::WaitableEvent(true, true);
26 SyncMessage::SyncMessage(
29 PriorityValue priority,
30 MessageReplyDeserializer* deserializer)
31 : Message(routing_id, type, priority),
32 deserializer_(deserializer),
33 pump_messages_event_(NULL)
39 // Add synchronous message data before the message payload.
41 header.message_id = g_next_id.GetNext();
42 WriteSyncHeader(this, header);
45 MessageReplyDeserializer* SyncMessage::GetReplyDeserializer() {
46 MessageReplyDeserializer* rv = deserializer_;
52 void SyncMessage::EnableMessagePumping() {
53 DCHECK(!pump_messages_event_);
54 set_pump_messages_event(dummy_event);
57 bool SyncMessage::IsMessageReplyTo(const Message& msg, int request_id) {
61 return GetMessageId(msg) == request_id;
64 void* SyncMessage::GetDataIterator(const Message* msg) {
65 void* iter = const_cast<char*>(msg->payload());
66 UpdateIter(&iter, kSyncMessageHeaderSize);
70 int SyncMessage::GetMessageId(const Message& msg) {
71 if (!msg.is_sync() && !msg.is_reply())
75 if (!ReadSyncHeader(msg, &header))
78 return header.message_id;
81 Message* SyncMessage::GenerateReply(const Message* msg) {
82 DCHECK(msg->is_sync()) << "is_sync(" << msg->is_sync() <<")"<<std::endl;
84 Message* reply = new Message(msg->routing_id(), IPC_REPLY_ID,
90 // use the same message id, but this time reply bit is set
91 header.message_id = GetMessageId(*msg);
92 WriteSyncHeader(reply, header);
97 bool SyncMessage::ReadSyncHeader(const Message& msg, SyncHeader* header) {
98 DCHECK(msg.is_sync() || msg.is_reply());
101 bool result = msg.ReadInt(&iter, &header->message_id);
110 bool SyncMessage::WriteSyncHeader(Message* msg, const SyncHeader& header) {
111 DCHECK(msg->is_sync() || msg->is_reply());
112 DCHECK(msg->payload_size() == 0);
113 bool result = msg->WriteInt(header.message_id);
119 // Note: if you add anything here, you need to update kSyncMessageHeaderSize.
120 DCHECK(kSyncMessageHeaderSize == msg->payload_size());
126 bool MessageReplyDeserializer::SerializeOutputParameters(const Message& msg) {
127 return SerializeOutputParameters(msg, SyncMessage::GetDataIterator(&msg));