1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/ipc/chromium/src/chrome/common/ipc_message.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,162 @@ 1.4 +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 + 1.8 +#include "chrome/common/ipc_message.h" 1.9 + 1.10 +#include "base/logging.h" 1.11 +#include "build/build_config.h" 1.12 + 1.13 +#if defined(OS_POSIX) 1.14 +#include "chrome/common/file_descriptor_set_posix.h" 1.15 +#endif 1.16 +#ifdef MOZ_TASK_TRACER 1.17 +#include "GeckoTaskTracer.h" 1.18 +#endif 1.19 + 1.20 +#ifdef MOZ_TASK_TRACER 1.21 +using namespace mozilla::tasktracer; 1.22 +#endif 1.23 + 1.24 +namespace IPC { 1.25 + 1.26 +//------------------------------------------------------------------------------ 1.27 + 1.28 +Message::~Message() { 1.29 +} 1.30 + 1.31 +Message::Message() 1.32 + : Pickle(sizeof(Header)) { 1.33 + header()->routing = header()->type = header()->flags = 0; 1.34 +#if defined(OS_POSIX) 1.35 + header()->num_fds = 0; 1.36 +#endif 1.37 +#ifdef MOZ_TASK_TRACER 1.38 + header()->source_event_id = 0; 1.39 + header()->parent_task_id = 0; 1.40 + header()->source_event_type = SourceEventType::UNKNOWN; 1.41 +#endif 1.42 + InitLoggingVariables(); 1.43 +} 1.44 + 1.45 +Message::Message(int32_t routing_id, msgid_t type, PriorityValue priority, 1.46 + MessageCompression compression, const char* const name) 1.47 + : Pickle(sizeof(Header)) { 1.48 + header()->routing = routing_id; 1.49 + header()->type = type; 1.50 + header()->flags = priority; 1.51 + if (compression == COMPRESSION_ENABLED) 1.52 + header()->flags |= COMPRESS_BIT; 1.53 +#if defined(OS_POSIX) 1.54 + header()->num_fds = 0; 1.55 +#endif 1.56 + header()->interrupt_remote_stack_depth_guess = static_cast<uint32_t>(-1); 1.57 + header()->interrupt_local_stack_depth = static_cast<uint32_t>(-1); 1.58 + header()->seqno = 0; 1.59 +#if defined(OS_MACOSX) 1.60 + header()->cookie = 0; 1.61 +#endif 1.62 +#ifdef MOZ_TASK_TRACER 1.63 + header()->source_event_id = 0; 1.64 + header()->parent_task_id = 0; 1.65 + header()->source_event_type = SourceEventType::UNKNOWN; 1.66 +#endif 1.67 + InitLoggingVariables(name); 1.68 +} 1.69 + 1.70 +Message::Message(const char* data, int data_len) : Pickle(data, data_len) { 1.71 + InitLoggingVariables(); 1.72 +} 1.73 + 1.74 +Message::Message(const Message& other) : Pickle(other) { 1.75 + InitLoggingVariables(other.name_); 1.76 +#if defined(OS_POSIX) 1.77 + file_descriptor_set_ = other.file_descriptor_set_; 1.78 +#endif 1.79 +#ifdef MOZ_TASK_TRACER 1.80 + header()->source_event_id = other.header()->source_event_id; 1.81 + header()->parent_task_id = other.header()->parent_task_id; 1.82 + header()->source_event_type = other.header()->source_event_type; 1.83 +#endif 1.84 +} 1.85 + 1.86 +void Message::InitLoggingVariables(const char* const name) { 1.87 + name_ = name; 1.88 +#ifdef IPC_MESSAGE_LOG_ENABLED 1.89 + received_time_ = 0; 1.90 + dont_log_ = false; 1.91 + log_data_ = NULL; 1.92 +#endif 1.93 +} 1.94 + 1.95 +Message& Message::operator=(const Message& other) { 1.96 + *static_cast<Pickle*>(this) = other; 1.97 + InitLoggingVariables(other.name_); 1.98 +#if defined(OS_POSIX) 1.99 + file_descriptor_set_ = other.file_descriptor_set_; 1.100 +#endif 1.101 +#ifdef MOZ_TASK_TRACER 1.102 + header()->source_event_id = other.header()->source_event_id; 1.103 + header()->parent_task_id = other.header()->parent_task_id; 1.104 + header()->source_event_type = other.header()->source_event_type; 1.105 +#endif 1.106 + return *this; 1.107 +} 1.108 + 1.109 +#ifdef IPC_MESSAGE_LOG_ENABLED 1.110 +void Message::set_sent_time(int64_t time) { 1.111 + DCHECK((header()->flags & HAS_SENT_TIME_BIT) == 0); 1.112 + header()->flags |= HAS_SENT_TIME_BIT; 1.113 + WriteInt64(time); 1.114 +} 1.115 + 1.116 +int64_t Message::sent_time() const { 1.117 + if ((header()->flags & HAS_SENT_TIME_BIT) == 0) 1.118 + return 0; 1.119 + 1.120 + const char* data = end_of_payload(); 1.121 + data -= sizeof(int64_t); 1.122 + return *(reinterpret_cast<const int64_t*>(data)); 1.123 +} 1.124 + 1.125 +void Message::set_received_time(int64_t time) const { 1.126 + received_time_ = time; 1.127 +} 1.128 +#endif 1.129 + 1.130 +#if defined(OS_POSIX) 1.131 +bool Message::WriteFileDescriptor(const base::FileDescriptor& descriptor) { 1.132 + // We write the index of the descriptor so that we don't have to 1.133 + // keep the current descriptor as extra decoding state when deserialising. 1.134 + WriteInt(file_descriptor_set()->size()); 1.135 + if (descriptor.auto_close) { 1.136 + return file_descriptor_set()->AddAndAutoClose(descriptor.fd); 1.137 + } else { 1.138 + return file_descriptor_set()->Add(descriptor.fd); 1.139 + } 1.140 +} 1.141 + 1.142 +bool Message::ReadFileDescriptor(void** iter, 1.143 + base::FileDescriptor* descriptor) const { 1.144 + int descriptor_index; 1.145 + if (!ReadInt(iter, &descriptor_index)) 1.146 + return false; 1.147 + 1.148 + FileDescriptorSet* file_descriptor_set = file_descriptor_set_.get(); 1.149 + if (!file_descriptor_set) 1.150 + return false; 1.151 + 1.152 + descriptor->fd = file_descriptor_set->GetDescriptorAt(descriptor_index); 1.153 + descriptor->auto_close = false; 1.154 + 1.155 + return descriptor->fd >= 0; 1.156 +} 1.157 + 1.158 +void Message::EnsureFileDescriptorSet() { 1.159 + if (file_descriptor_set_.get() == NULL) 1.160 + file_descriptor_set_ = new FileDescriptorSet; 1.161 +} 1.162 + 1.163 +#endif 1.164 + 1.165 +} // namespace IPC