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

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: 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::AllocData(uint32_t num_bytes) {
31 MOJO_DCHECK(!data_); 31 buffer_->AllocData(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::AllocUninitializedData(uint32_t num_bytes) {
37 MOJO_DCHECK(!data_); 35 buffer_->AllocUninitializedData(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
yzshen1 2015/12/15 19:07:02 Please consider removing line 41 and 47-48, and re
45 destination->FreeDataAndCloseHandles(); 41 destination->CloseHandles();
46 42
47 // No copy needed. 43 // No copy needed.
48 destination->data_num_bytes_ = data_num_bytes_; 44 std::swap(destination->buffer_, buffer_);
49 destination->data_ = data_;
50 std::swap(destination->handles_, handles_); 45 std::swap(destination->handles_, handles_);
51 46
52 handles_.clear(); 47 handles_.clear();
53 Initialize(); 48 Initialize();
54 } 49 }
55 50
56 void Message::Initialize() { 51 void Message::Initialize() {
57 data_num_bytes_ = 0; 52 buffer_.reset(new internal::PickleBuffer);
58 data_ = nullptr;
59 } 53 }
60 54
61 void Message::FreeDataAndCloseHandles() { 55 void Message::CloseHandles() {
62 free(data_);
63
64 for (std::vector<Handle>::iterator it = handles_.begin(); 56 for (std::vector<Handle>::iterator it = handles_.begin();
65 it != handles_.end(); ++it) { 57 it != handles_.end(); ++it) {
66 if (it->is_valid()) 58 if (it->is_valid())
67 CloseRaw(*it); 59 CloseRaw(*it);
68 } 60 }
69 } 61 }
70 62
71 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle, 63 MojoResult ReadAndDispatchMessage(MessagePipeHandle handle,
72 MessageReceiver* receiver, 64 MessageReceiver* receiver,
73 bool* receiver_result) { 65 bool* receiver_result) {
74 MojoResult rv; 66 MojoResult rv;
75 67
76 uint32_t num_bytes = 0, num_handles = 0; 68 uint32_t num_bytes = 0, num_handles = 0;
77 rv = ReadMessageRaw(handle, 69 rv = ReadMessageRaw(handle,
78 nullptr, 70 nullptr,
79 &num_bytes, 71 &num_bytes,
80 nullptr, 72 nullptr,
81 &num_handles, 73 &num_handles,
82 MOJO_READ_MESSAGE_FLAG_NONE); 74 MOJO_READ_MESSAGE_FLAG_NONE);
83 if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED) 75 if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED)
84 return rv; 76 return rv;
85 77
86 Message message; 78 Message message;
87 message.AllocUninitializedData(num_bytes); 79 message.AllocUninitializedData(num_bytes);
80 void* mutable_data = message.buffer()->Allocate(num_bytes);
yzshen1 2015/12/15 19:07:02 It seems fairly confusing to require two allocate
88 message.mutable_handles()->resize(num_handles); 81 message.mutable_handles()->resize(num_handles);
89 82
90 rv = ReadMessageRaw( 83 rv = ReadMessageRaw(
91 handle, 84 handle,
92 message.mutable_data(), 85 mutable_data,
93 &num_bytes, 86 &num_bytes,
94 message.mutable_handles()->empty() 87 message.mutable_handles()->empty()
95 ? nullptr 88 ? nullptr
96 : reinterpret_cast<MojoHandle*>(&message.mutable_handles()->front()), 89 : reinterpret_cast<MojoHandle*>(message.mutable_handles()->data()),
97 &num_handles, 90 &num_handles,
98 MOJO_READ_MESSAGE_FLAG_NONE); 91 MOJO_READ_MESSAGE_FLAG_NONE);
99 if (receiver && rv == MOJO_RESULT_OK) 92 if (receiver && rv == MOJO_RESULT_OK)
100 *receiver_result = receiver->Accept(&message); 93 *receiver_result = receiver->Accept(&message);
101 94
102 return rv; 95 return rv;
103 } 96 }
104 97
105 } // namespace mojo 98 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698