| OLD | NEW |
| 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/system/message_in_transit.h" | 5 #include "mojo/system/message_in_transit.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <new> | 9 #include <new> |
| 10 | 10 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 memcpy(secondary_buffer_, message_view.secondary_buffer(), | 141 memcpy(secondary_buffer_, message_view.secondary_buffer(), |
| 142 secondary_buffer_size_); | 142 secondary_buffer_size_); |
| 143 | 143 |
| 144 DCHECK_EQ(main_buffer_size_, | 144 DCHECK_EQ(main_buffer_size_, |
| 145 RoundUpMessageAlignment(sizeof(Header) + num_bytes())); | 145 RoundUpMessageAlignment(sizeof(Header) + num_bytes())); |
| 146 } | 146 } |
| 147 | 147 |
| 148 MessageInTransit::~MessageInTransit() { | 148 MessageInTransit::~MessageInTransit() { |
| 149 base::AlignedFree(main_buffer_); | 149 base::AlignedFree(main_buffer_); |
| 150 base::AlignedFree(secondary_buffer_); // Okay if null. | 150 base::AlignedFree(secondary_buffer_); // Okay if null. |
| 151 #ifndef NDEBUG | |
| 152 main_buffer_size_ = 0; | |
| 153 main_buffer_ = NULL; | |
| 154 secondary_buffer_size_ = 0; | |
| 155 secondary_buffer_ = NULL; | |
| 156 #endif | |
| 157 | 151 |
| 158 if (dispatchers_.get()) { | 152 if (dispatchers_) { |
| 159 for (size_t i = 0; i < dispatchers_->size(); i++) { | 153 for (size_t i = 0; i < dispatchers_->size(); i++) { |
| 160 if (!(*dispatchers_)[i]) | 154 if (!(*dispatchers_)[i]) |
| 161 continue; | 155 continue; |
| 162 | 156 |
| 163 DCHECK((*dispatchers_)[i]->HasOneRef()); | 157 DCHECK((*dispatchers_)[i]->HasOneRef()); |
| 164 (*dispatchers_)[i]->Close(); | 158 (*dispatchers_)[i]->Close(); |
| 165 } | 159 } |
| 166 dispatchers_.reset(); | |
| 167 } | 160 } |
| 161 |
| 162 if (platform_handles_) { |
| 163 for (size_t i = 0; i < platform_handles_->size(); i++) |
| 164 (*platform_handles_)[i].CloseIfNecessary(); |
| 165 } |
| 166 |
| 167 #ifndef NDEBUG |
| 168 main_buffer_size_ = 0; |
| 169 main_buffer_ = NULL; |
| 170 secondary_buffer_size_ = 0; |
| 171 secondary_buffer_ = NULL; |
| 172 dispatchers_.reset(); |
| 173 platform_handles_.reset(); |
| 174 #endif |
| 168 } | 175 } |
| 169 | 176 |
| 170 // static | 177 // static |
| 171 bool MessageInTransit::GetNextMessageSize(const void* buffer, | 178 bool MessageInTransit::GetNextMessageSize(const void* buffer, |
| 172 size_t buffer_size, | 179 size_t buffer_size, |
| 173 size_t* next_message_size) { | 180 size_t* next_message_size) { |
| 174 DCHECK(next_message_size); | 181 DCHECK(next_message_size); |
| 175 if (!buffer_size) | 182 if (!buffer_size) |
| 176 return false; | 183 return false; |
| 177 DCHECK(buffer); | 184 DCHECK(buffer); |
| 178 DCHECK_EQ(reinterpret_cast<uintptr_t>(buffer) % | 185 DCHECK_EQ(reinterpret_cast<uintptr_t>(buffer) % |
| 179 MessageInTransit::kMessageAlignment, 0u); | 186 MessageInTransit::kMessageAlignment, 0u); |
| 180 | 187 |
| 181 if (buffer_size < sizeof(Header)) | 188 if (buffer_size < sizeof(Header)) |
| 182 return false; | 189 return false; |
| 183 | 190 |
| 184 const Header* header = static_cast<const Header*>(buffer); | 191 const Header* header = static_cast<const Header*>(buffer); |
| 185 *next_message_size = header->total_size; | 192 *next_message_size = header->total_size; |
| 186 DCHECK_EQ(*next_message_size % kMessageAlignment, 0u); | 193 DCHECK_EQ(*next_message_size % kMessageAlignment, 0u); |
| 187 return true; | 194 return true; |
| 188 } | 195 } |
| 189 | 196 |
| 190 void MessageInTransit::SetDispatchers( | 197 void MessageInTransit::SetDispatchers( |
| 191 scoped_ptr<std::vector<scoped_refptr<Dispatcher> > > dispatchers) { | 198 scoped_ptr<std::vector<scoped_refptr<Dispatcher> > > dispatchers) { |
| 192 DCHECK(dispatchers.get()); | 199 DCHECK(dispatchers); |
| 193 DCHECK(!dispatchers_.get()); | 200 DCHECK(!dispatchers_); |
| 194 | 201 |
| 195 dispatchers_ = dispatchers.Pass(); | 202 dispatchers_ = dispatchers.Pass(); |
| 196 #ifndef NDEBUG | 203 #ifndef NDEBUG |
| 197 for (size_t i = 0; i < dispatchers_->size(); i++) | 204 for (size_t i = 0; i < dispatchers_->size(); i++) |
| 198 DCHECK(!(*dispatchers_)[i] || (*dispatchers_)[i]->HasOneRef()); | 205 DCHECK(!(*dispatchers_)[i] || (*dispatchers_)[i]->HasOneRef()); |
| 199 #endif | 206 #endif |
| 200 } | 207 } |
| 201 | 208 |
| 202 void MessageInTransit::SerializeAndCloseDispatchers(Channel* channel) { | 209 void MessageInTransit::SerializeAndCloseDispatchers(Channel* channel) { |
| 203 DCHECK(channel); | 210 DCHECK(channel); |
| 204 DCHECK(!secondary_buffer_); | 211 DCHECK(!secondary_buffer_); |
| 205 CHECK_EQ(num_handles(), | 212 CHECK_EQ(num_handles(), |
| 206 dispatchers_.get() ? dispatchers_->size() : static_cast<size_t>(0)); | 213 dispatchers_ ? dispatchers_->size() : static_cast<size_t>(0)); |
| 207 | 214 |
| 208 if (!num_handles()) | 215 if (!num_handles()) |
| 209 return; | 216 return; |
| 210 | 217 |
| 211 size_t handle_table_size = num_handles() * sizeof(HandleTableEntry); | 218 size_t handle_table_size = num_handles() * sizeof(HandleTableEntry); |
| 212 // The size of the secondary buffer. We'll start with the size of the handle | 219 // The size of the secondary buffer. We'll start with the size of the handle |
| 213 // table, and add to it as we go along. | 220 // table, and add to it as we go along. |
| 214 size_t size = handle_table_size; | 221 size_t size = handle_table_size; |
| 215 for (size_t i = 0; i < dispatchers_->size(); i++) { | 222 for (size_t i = 0; i < dispatchers_->size(); i++) { |
| 216 if (Dispatcher* dispatcher = (*dispatchers_)[i].get()) { | 223 if (Dispatcher* dispatcher = (*dispatchers_)[i].get()) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 } | 263 } |
| 257 | 264 |
| 258 current_offset += RoundUpMessageAlignment(actual_size); | 265 current_offset += RoundUpMessageAlignment(actual_size); |
| 259 DCHECK_LE(current_offset, size); | 266 DCHECK_LE(current_offset, size); |
| 260 } | 267 } |
| 261 | 268 |
| 262 UpdateTotalSize(); | 269 UpdateTotalSize(); |
| 263 } | 270 } |
| 264 | 271 |
| 265 void MessageInTransit::DeserializeDispatchers(Channel* channel) { | 272 void MessageInTransit::DeserializeDispatchers(Channel* channel) { |
| 266 DCHECK(!dispatchers_.get()); | 273 DCHECK(!dispatchers_); |
| 267 | 274 |
| 268 // This should have been checked by calling |IsValid()| on the |View| first. | 275 // This should have been checked by calling |IsValid()| on the |View| first. |
| 269 DCHECK_LE(num_handles(), kMaxMessageNumHandles); | 276 DCHECK_LE(num_handles(), kMaxMessageNumHandles); |
| 270 | 277 |
| 271 if (!num_handles()) | 278 if (!num_handles()) |
| 272 return; | 279 return; |
| 273 | 280 |
| 274 dispatchers_.reset( | 281 dispatchers_.reset( |
| 275 new std::vector<scoped_refptr<Dispatcher> >(num_handles())); | 282 new std::vector<scoped_refptr<Dispatcher> >(num_handles())); |
| 276 | 283 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 | 353 |
| 347 void MessageInTransit::UpdateTotalSize() { | 354 void MessageInTransit::UpdateTotalSize() { |
| 348 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u); | 355 DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u); |
| 349 DCHECK_EQ(secondary_buffer_size_ % kMessageAlignment, 0u); | 356 DCHECK_EQ(secondary_buffer_size_ % kMessageAlignment, 0u); |
| 350 header()->total_size = | 357 header()->total_size = |
| 351 static_cast<uint32_t>(main_buffer_size_ + secondary_buffer_size_); | 358 static_cast<uint32_t>(main_buffer_size_ + secondary_buffer_size_); |
| 352 } | 359 } |
| 353 | 360 |
| 354 } // namespace system | 361 } // namespace system |
| 355 } // namespace mojo | 362 } // namespace mojo |
| OLD | NEW |