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

Side by Side Diff: mojo/public/cpp/bindings/lib/message.cc

Issue 1524613002: [mojo] Use base::Pickle for Message storage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: some cleanup Created 5 years 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/public/cpp/bindings/message.h" 5 #include "mojo/public/cpp/bindings/message.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "mojo/public/cpp/environment/logging.h" 11 #include "mojo/public/cpp/environment/logging.h"
12 12
13 namespace mojo { 13 namespace mojo {
14 14
15 Message::Message() { 15 Message::Message() {
16 Initialize(); 16 Initialize();
17 } 17 }
18 18
19 Message::~Message() { 19 Message::~Message() {
20 FreeDataAndCloseHandles(); 20 CloseHandles();
21 } 21 }
22 22
23 void Message::Reset() { 23 void Message::Reset() {
24 FreeDataAndCloseHandles(); 24 CloseHandles();
25 25
26 handles_.clear(); 26 handles_.clear();
27 Initialize(); 27 Initialize();
28 } 28 }
29 29
30 void Message::AllocData(uint32_t num_bytes) { 30 void Message::ReserveCapacity(uint32_t num_bytes) {
yzshen1 2015/12/15 22:27:08 According to our discussion, let's make it Initial
Ken Rockot(use gerrit already) 2015/12/16 00:09:33 Done
31 MOJO_DCHECK(!data_); 31 buffer_->ReserveCapacity(num_bytes);
32 data_num_bytes_ = num_bytes;
33 data_ = static_cast<internal::MessageData*>(calloc(num_bytes, 1));
34 } 32 }
35 33
36 void Message::AllocUninitializedData(uint32_t num_bytes) { 34 void Message::ReserveUninitializedCapacity(uint32_t num_bytes) {
37 MOJO_DCHECK(!data_); 35 buffer_->ReserveUninitializedCapacity(num_bytes);
38 data_num_bytes_ = num_bytes;
39 data_ = static_cast<internal::MessageData*>(malloc(num_bytes));
40 } 36 }
41 37
42 void Message::MoveTo(Message* destination) { 38 void Message::MoveTo(Message* destination) {
43 MOJO_DCHECK(this != destination); 39 MOJO_DCHECK(this != destination);
44 40
45 destination->FreeDataAndCloseHandles();
46
47 // No copy needed. 41 // No copy needed.
48 destination->data_num_bytes_ = data_num_bytes_; 42 std::swap(destination->buffer_, buffer_);
49 destination->data_ = data_;
50 std::swap(destination->handles_, handles_); 43 std::swap(destination->handles_, handles_);
51 44
52 handles_.clear(); 45 Reset();
53 Initialize();
54 } 46 }
55 47
56 void Message::Initialize() { 48 void Message::Initialize() {
57 data_num_bytes_ = 0; 49 buffer_.reset(new internal::PickleBuffer);
58 data_ = nullptr;
59 } 50 }
60 51
61 void Message::FreeDataAndCloseHandles() { 52 void Message::CloseHandles() {
62 free(data_);
63
64 for (std::vector<Handle>::iterator it = handles_.begin(); 53 for (std::vector<Handle>::iterator it = handles_.begin();
65 it != handles_.end(); ++it) { 54 it != handles_.end(); ++it) {
66 if (it->is_valid()) 55 if (it->is_valid())
67 CloseRaw(*it); 56 CloseRaw(*it);
68 } 57 }
69 } 58 }
70 59
71 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle, 60 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle,
72 MessageReceiver* receiver, 61 MessageReceiver* receiver,
73 bool* receiver_result) { 62 bool* receiver_result) {
74 MojoResult rv; 63 MojoResult rv;
75 64
76 uint32_t num_bytes = 0, num_handles = 0; 65 uint32_t num_bytes = 0, num_handles = 0;
77 rv = ReadMessageRaw(handle, 66 rv = ReadMessageRaw(handle,
78 nullptr, 67 nullptr,
79 &num_bytes, 68 &num_bytes,
80 nullptr, 69 nullptr,
81 &num_handles, 70 &num_handles,
82 MOJO_READ_MESSAGE_FLAG_NONE); 71 MOJO_READ_MESSAGE_FLAG_NONE);
83 if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED) 72 if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED)
84 return rv; 73 return rv;
85 74
86 Message message; 75 Message message;
87 message.AllocUninitializedData(num_bytes); 76 message.ReserveUninitializedCapacity(num_bytes);
77 void* mutable_data = message.buffer()->Allocate(num_bytes);
88 message.mutable_handles()->resize(num_handles); 78 message.mutable_handles()->resize(num_handles);
89 79
90 rv = ReadMessageRaw( 80 rv = ReadMessageRaw(
91 handle, 81 handle,
92 message.mutable_data(), 82 mutable_data,
93 &num_bytes, 83 &num_bytes,
94 message.mutable_handles()->empty() 84 message.mutable_handles()->empty()
95 ? nullptr 85 ? nullptr
96 : reinterpret_cast<MojoHandle*>(&message.mutable_handles()->front()), 86 : reinterpret_cast<MojoHandle*>(message.mutable_handles()->data()),
97 &num_handles, 87 &num_handles,
98 MOJO_READ_MESSAGE_FLAG_NONE); 88 MOJO_READ_MESSAGE_FLAG_NONE);
99 if (receiver && rv == MOJO_RESULT_OK) 89 if (receiver && rv == MOJO_RESULT_OK)
100 *receiver_result = receiver->Accept(&message); 90 *receiver_result = receiver->Accept(&message);
101 91
102 return rv; 92 return rv;
103 } 93 }
104 94
105 } // namespace mojo 95 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698