Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Side by Side Diff: mojo/edk/system/message_in_transit.cc

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/edk/system/message_in_transit.h" 5 #include "mojo/edk/system/message_in_transit.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <ostream> 9 #include <ostream>
10 10
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 if (e) { 62 if (e) {
63 *error_message = e; 63 *error_message = e;
64 return false; 64 return false;
65 } 65 }
66 } 66 }
67 67
68 return true; 68 return true;
69 } 69 }
70 70
71 MessageInTransit::MessageInTransit(Type type, 71 MessageInTransit::MessageInTransit(Type type,
72 Subtype subtype,
73 uint32_t num_bytes, 72 uint32_t num_bytes,
74 const void* bytes) 73 const void* bytes)
75 : main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)), 74 : main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)),
76 main_buffer_(static_cast<char*>( 75 main_buffer_(static_cast<char*>(
77 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) { 76 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) {
78 ConstructorHelper(type, subtype, num_bytes); 77 ConstructorHelper(type, num_bytes);
79 if (bytes) { 78 if (bytes) {
80 memcpy(MessageInTransit::bytes(), bytes, num_bytes); 79 memcpy(MessageInTransit::bytes(), bytes, num_bytes);
81 memset(static_cast<char*>(MessageInTransit::bytes()) + num_bytes, 0, 80 memset(static_cast<char*>(MessageInTransit::bytes()) + num_bytes, 0,
82 main_buffer_size_ - sizeof(Header) - num_bytes); 81 main_buffer_size_ - sizeof(Header) - num_bytes);
83 } else { 82 } else {
84 memset(MessageInTransit::bytes(), 0, main_buffer_size_ - sizeof(Header)); 83 memset(MessageInTransit::bytes(), 0, main_buffer_size_ - sizeof(Header));
85 } 84 }
86 } 85 }
87 86
88 MessageInTransit::MessageInTransit(Type type, 87 MessageInTransit::MessageInTransit(Type type,
89 Subtype subtype,
90 uint32_t num_bytes, 88 uint32_t num_bytes,
91 UserPointer<const void> bytes) 89 UserPointer<const void> bytes)
92 : main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)), 90 : main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)),
93 main_buffer_(static_cast<char*>( 91 main_buffer_(static_cast<char*>(
94 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) { 92 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) {
95 ConstructorHelper(type, subtype, num_bytes); 93 ConstructorHelper(type, num_bytes);
96 bytes.GetArray(MessageInTransit::bytes(), num_bytes); 94 bytes.GetArray(MessageInTransit::bytes(), num_bytes);
97 memset(static_cast<char*>(MessageInTransit::bytes()) + num_bytes, 0, 95 memset(static_cast<char*>(MessageInTransit::bytes()) + num_bytes, 0,
98 main_buffer_size_ - sizeof(Header) - num_bytes); 96 main_buffer_size_ - sizeof(Header) - num_bytes);
99 } 97 }
100 98
101 MessageInTransit::MessageInTransit(const View& message_view) 99 MessageInTransit::MessageInTransit(const View& message_view)
102 : main_buffer_size_(message_view.main_buffer_size()), 100 : main_buffer_size_(message_view.main_buffer_size()),
103 main_buffer_(static_cast<char*>( 101 main_buffer_(static_cast<char*>(
104 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) { 102 base::AlignedAlloc(main_buffer_size_, kMessageAlignment))) {
105 DCHECK_GE(main_buffer_size_, sizeof(Header)); 103 DCHECK_GE(main_buffer_size_, sizeof(Header));
106 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u); 104 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u);
107 105
108 memcpy(main_buffer_.get(), message_view.main_buffer(), main_buffer_size_); 106 memcpy(main_buffer_.get(), message_view.main_buffer(), main_buffer_size_);
109 DCHECK_EQ(main_buffer_size_, 107 DCHECK_EQ(main_buffer_size_,
110 RoundUpMessageAlignment(sizeof(Header) + num_bytes())); 108 RoundUpMessageAlignment(sizeof(Header) + num_bytes()));
111 } 109 }
112 110
113 MessageInTransit::~MessageInTransit() { 111 MessageInTransit::~MessageInTransit() {
114 if (dispatchers_) { 112 if (dispatchers_) {
115 for (size_t i = 0; i < dispatchers_->size(); i++) { 113 for (size_t i = 0; i < dispatchers_->size(); i++) {
116 if (!(*dispatchers_)[i]) 114 if (!(*dispatchers_)[i])
117 continue; 115 continue;
118 116
119 DCHECK((*dispatchers_)[i]->HasOneRef()); 117
118
119
120
121
122 //TODO(jam): why?
123 /// DCHECK((*dispatchers_)[i]->HasOneRef());
120 (*dispatchers_)[i]->Close(); 124 (*dispatchers_)[i]->Close();
121 } 125 }
122 } 126 }
123 } 127 }
124 128
125 // static 129 // static
126 bool MessageInTransit::GetNextMessageSize(const void* buffer, 130 bool MessageInTransit::GetNextMessageSize(const void* buffer,
127 size_t buffer_size, 131 size_t buffer_size,
128 size_t* next_message_size) { 132 size_t* next_message_size) {
129 DCHECK(next_message_size); 133 DCHECK(next_message_size);
(...skipping 14 matching lines...) Expand all
144 } 148 }
145 149
146 void MessageInTransit::SetDispatchers( 150 void MessageInTransit::SetDispatchers(
147 scoped_ptr<DispatcherVector> dispatchers) { 151 scoped_ptr<DispatcherVector> dispatchers) {
148 DCHECK(dispatchers); 152 DCHECK(dispatchers);
149 DCHECK(!dispatchers_); 153 DCHECK(!dispatchers_);
150 DCHECK(!transport_data_); 154 DCHECK(!transport_data_);
151 155
152 dispatchers_ = dispatchers.Pass(); 156 dispatchers_ = dispatchers.Pass();
153 #ifndef NDEBUG 157 #ifndef NDEBUG
154 for (size_t i = 0; i < dispatchers_->size(); i++) 158 //for (size_t i = 0; i < dispatchers_->size(); i++)
155 DCHECK(!(*dispatchers_)[i] || (*dispatchers_)[i]->HasOneRef()); 159
160
161
162
163 // JAM: fires in process receiving MP. is this because it's posting task to
164 // do rawchannel::init onio?
165
166 //DCHECK(!(*dispatchers_)[i] || (*dispatchers_)[i]->HasOneRef());
156 #endif 167 #endif
157 } 168 }
158 169
159 void MessageInTransit::SetTransportData( 170 void MessageInTransit::SetTransportData(
160 scoped_ptr<TransportData> transport_data) { 171 scoped_ptr<TransportData> transport_data) {
161 DCHECK(transport_data); 172 DCHECK(transport_data);
162 DCHECK(!transport_data_); 173 DCHECK(!transport_data_);
163 DCHECK(!dispatchers_); 174 DCHECK(!dispatchers_);
164 175
165 transport_data_ = transport_data.Pass(); 176 transport_data_ = transport_data.Pass();
166 UpdateTotalSize(); 177 UpdateTotalSize();
167 } 178 }
168 179
169 void MessageInTransit::SerializeAndCloseDispatchers(Channel* channel) { 180 void MessageInTransit::SerializeAndCloseDispatchers() {
170 DCHECK(channel);
171 DCHECK(!transport_data_); 181 DCHECK(!transport_data_);
172 182
173 if (!dispatchers_ || !dispatchers_->size()) 183 if (!dispatchers_ || !dispatchers_->size())
174 return; 184 return;
175 185
176 transport_data_.reset(new TransportData(dispatchers_.Pass(), channel)); 186 transport_data_.reset(new TransportData(dispatchers_.Pass()));
177 187
178 // Update the sizes in the message header. 188 // Update the sizes in the message header.
179 UpdateTotalSize(); 189 UpdateTotalSize();
180 } 190 }
181 191
182 void MessageInTransit::ConstructorHelper(Type type, 192 void MessageInTransit::ConstructorHelper(Type type,
183 Subtype subtype,
184 uint32_t num_bytes) { 193 uint32_t num_bytes) {
185 DCHECK_LE(num_bytes, GetConfiguration().max_message_num_bytes); 194 DCHECK_LE(num_bytes, GetConfiguration().max_message_num_bytes);
186 195
187 // |total_size| is updated below, from the other values. 196 // |total_size| is updated below, from the other values.
188 header()->type = type; 197 header()->type = type;
189 header()->subtype = subtype;
190 header()->source_id = ChannelEndpointId();
191 header()->destination_id = ChannelEndpointId();
192 header()->num_bytes = num_bytes; 198 header()->num_bytes = num_bytes;
193 header()->unused = 0; 199 header()->unused = 0;
194 // Note: If dispatchers are subsequently attached, then |total_size| will have 200 // Note: If dispatchers are subsequently attached, then |total_size| will have
195 // to be adjusted. 201 // to be adjusted.
196 UpdateTotalSize(); 202 UpdateTotalSize();
197 } 203 }
198 204
199 void MessageInTransit::UpdateTotalSize() { 205 void MessageInTransit::UpdateTotalSize() {
200 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u); 206 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u);
201 header()->total_size = static_cast<uint32_t>(main_buffer_size_); 207 header()->total_size = static_cast<uint32_t>(main_buffer_size_);
202 if (transport_data_) { 208 if (transport_data_) {
203 header()->total_size += 209 header()->total_size +=
204 static_cast<uint32_t>(transport_data_->buffer_size()); 210 static_cast<uint32_t>(transport_data_->buffer_size());
205 } 211 }
206 } 212 }
207 213
208 } // namespace system 214 } // namespace system
209 } // namespace mojo 215 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698