ipc/chromium/src/chrome/common/ipc_message.cc

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Copyright (c) 2006-2008 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 "chrome/common/ipc_message.h"
     7 #include "base/logging.h"
     8 #include "build/build_config.h"
    10 #if defined(OS_POSIX)
    11 #include "chrome/common/file_descriptor_set_posix.h"
    12 #endif
    13 #ifdef MOZ_TASK_TRACER
    14 #include "GeckoTaskTracer.h"
    15 #endif
    17 #ifdef MOZ_TASK_TRACER
    18 using namespace mozilla::tasktracer;
    19 #endif
    21 namespace IPC {
    23 //------------------------------------------------------------------------------
    25 Message::~Message() {
    26 }
    28 Message::Message()
    29     : Pickle(sizeof(Header)) {
    30   header()->routing = header()->type = header()->flags = 0;
    31 #if defined(OS_POSIX)
    32   header()->num_fds = 0;
    33 #endif
    34 #ifdef MOZ_TASK_TRACER
    35   header()->source_event_id = 0;
    36   header()->parent_task_id = 0;
    37   header()->source_event_type = SourceEventType::UNKNOWN;
    38 #endif
    39   InitLoggingVariables();
    40 }
    42 Message::Message(int32_t routing_id, msgid_t type, PriorityValue priority,
    43                  MessageCompression compression, const char* const name)
    44     : Pickle(sizeof(Header)) {
    45   header()->routing = routing_id;
    46   header()->type = type;
    47   header()->flags = priority;
    48   if (compression == COMPRESSION_ENABLED)
    49     header()->flags |= COMPRESS_BIT;
    50 #if defined(OS_POSIX)
    51   header()->num_fds = 0;
    52 #endif
    53   header()->interrupt_remote_stack_depth_guess = static_cast<uint32_t>(-1);
    54   header()->interrupt_local_stack_depth = static_cast<uint32_t>(-1);
    55   header()->seqno = 0;
    56 #if defined(OS_MACOSX)
    57   header()->cookie = 0;
    58 #endif
    59 #ifdef MOZ_TASK_TRACER
    60   header()->source_event_id = 0;
    61   header()->parent_task_id = 0;
    62   header()->source_event_type = SourceEventType::UNKNOWN;
    63 #endif
    64   InitLoggingVariables(name);
    65 }
    67 Message::Message(const char* data, int data_len) : Pickle(data, data_len) {
    68   InitLoggingVariables();
    69 }
    71 Message::Message(const Message& other) : Pickle(other) {
    72   InitLoggingVariables(other.name_);
    73 #if defined(OS_POSIX)
    74   file_descriptor_set_ = other.file_descriptor_set_;
    75 #endif
    76 #ifdef MOZ_TASK_TRACER
    77   header()->source_event_id = other.header()->source_event_id;
    78   header()->parent_task_id = other.header()->parent_task_id;
    79   header()->source_event_type = other.header()->source_event_type;
    80 #endif
    81 }
    83 void Message::InitLoggingVariables(const char* const name) {
    84   name_ = name;
    85 #ifdef IPC_MESSAGE_LOG_ENABLED
    86   received_time_ = 0;
    87   dont_log_ = false;
    88   log_data_ = NULL;
    89 #endif
    90 }
    92 Message& Message::operator=(const Message& other) {
    93   *static_cast<Pickle*>(this) = other;
    94   InitLoggingVariables(other.name_);
    95 #if defined(OS_POSIX)
    96   file_descriptor_set_ = other.file_descriptor_set_;
    97 #endif
    98 #ifdef MOZ_TASK_TRACER
    99   header()->source_event_id = other.header()->source_event_id;
   100   header()->parent_task_id = other.header()->parent_task_id;
   101   header()->source_event_type = other.header()->source_event_type;
   102 #endif
   103   return *this;
   104 }
   106 #ifdef IPC_MESSAGE_LOG_ENABLED
   107 void Message::set_sent_time(int64_t time) {
   108   DCHECK((header()->flags & HAS_SENT_TIME_BIT) == 0);
   109   header()->flags |= HAS_SENT_TIME_BIT;
   110   WriteInt64(time);
   111 }
   113 int64_t Message::sent_time() const {
   114   if ((header()->flags & HAS_SENT_TIME_BIT) == 0)
   115     return 0;
   117   const char* data = end_of_payload();
   118   data -= sizeof(int64_t);
   119   return *(reinterpret_cast<const int64_t*>(data));
   120 }
   122 void Message::set_received_time(int64_t time) const {
   123   received_time_ = time;
   124 }
   125 #endif
   127 #if defined(OS_POSIX)
   128 bool Message::WriteFileDescriptor(const base::FileDescriptor& descriptor) {
   129   // We write the index of the descriptor so that we don't have to
   130   // keep the current descriptor as extra decoding state when deserialising.
   131   WriteInt(file_descriptor_set()->size());
   132   if (descriptor.auto_close) {
   133     return file_descriptor_set()->AddAndAutoClose(descriptor.fd);
   134   } else {
   135     return file_descriptor_set()->Add(descriptor.fd);
   136   }
   137 }
   139 bool Message::ReadFileDescriptor(void** iter,
   140                                 base::FileDescriptor* descriptor) const {
   141   int descriptor_index;
   142   if (!ReadInt(iter, &descriptor_index))
   143     return false;
   145   FileDescriptorSet* file_descriptor_set = file_descriptor_set_.get();
   146   if (!file_descriptor_set)
   147     return false;
   149   descriptor->fd = file_descriptor_set->GetDescriptorAt(descriptor_index);
   150   descriptor->auto_close = false;
   152   return descriptor->fd >= 0;
   153 }
   155 void Message::EnsureFileDescriptorSet() {
   156   if (file_descriptor_set_.get() == NULL)
   157     file_descriptor_set_ = new FileDescriptorSet;
   158 }
   160 #endif
   162 }  // namespace IPC

mercurial