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/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 Loading... |
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 Loading... |
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 |
OLD | NEW |