| Index: mojo/edk/system/transport_data.cc
|
| diff --git a/mojo/edk/system/transport_data.cc b/mojo/edk/system/transport_data.cc
|
| index 058d795af6fdca86ddf96d56d3e5ee630b3cd488..05a03ba258b6db1fc911c7e187c4fecc047fda10 100644
|
| --- a/mojo/edk/system/transport_data.cc
|
| +++ b/mojo/edk/system/transport_data.cc
|
| @@ -19,22 +19,6 @@ using mojo::platform::ScopedPlatformHandle;
|
| namespace mojo {
|
| namespace system {
|
|
|
| -namespace {
|
| -
|
| -// TODO(vtl): Temporary, until |TransportData| really supports handles.
|
| -std::unique_ptr<DispatcherVector> DispatcherVectorFromHandleVector(
|
| - std::unique_ptr<HandleVector> handles) {
|
| - DCHECK(handles);
|
| -
|
| - std::unique_ptr<DispatcherVector> dispatchers(new DispatcherVector());
|
| - dispatchers->reserve(handles->size());
|
| - for (size_t i = 0; i < handles->size(); i++)
|
| - dispatchers->push_back(std::move(handles->at(i).dispatcher));
|
| - return dispatchers;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| // The maximum amount of space needed per platform handle.
|
| // (|{Channel,RawChannel}::GetSerializedPlatformHandleSize()| should always
|
| // return a value which is at most this. This is only used to calculate
|
| @@ -79,19 +63,13 @@ struct TransportData::PrivateStructForCompileAsserts {
|
| "alignment");
|
| };
|
|
|
| -// TODO(vtl): Make this the real one.
|
| TransportData::TransportData(std::unique_ptr<HandleVector> handles,
|
| Channel* channel)
|
| - : TransportData(DispatcherVectorFromHandleVector(std::move(handles)),
|
| - channel) {}
|
| -
|
| -TransportData::TransportData(std::unique_ptr<DispatcherVector> dispatchers,
|
| - Channel* channel)
|
| : buffer_size_() {
|
| - DCHECK(dispatchers);
|
| + DCHECK(handles);
|
| DCHECK(channel);
|
|
|
| - const size_t num_handles = dispatchers->size();
|
| + const size_t num_handles = handles->size();
|
| DCHECK_GT(num_handles, 0u);
|
|
|
| // The offset to the start of the (Mojo) handle table.
|
| @@ -108,11 +86,12 @@ TransportData::TransportData(std::unique_ptr<DispatcherVector> dispatchers,
|
| std::vector<size_t> all_max_platform_handles(num_handles);
|
| #endif
|
| for (size_t i = 0; i < num_handles; i++) {
|
| - if (Dispatcher* dispatcher = (*dispatchers)[i].get()) {
|
| + if (handles->at(i)) {
|
| size_t max_size = 0;
|
| size_t max_platform_handles = 0;
|
| Dispatcher::TransportDataAccess::StartSerialize(
|
| - dispatcher, channel, &max_size, &max_platform_handles);
|
| + handles->at(i).dispatcher.get(), channel, &max_size,
|
| + &max_platform_handles);
|
|
|
| DCHECK_LE(max_size, kMaxSerializedDispatcherSize);
|
| estimated_size += MessageInTransit::RoundUpMessageAlignment(max_size);
|
| @@ -159,8 +138,8 @@ TransportData::TransportData(std::unique_ptr<DispatcherVector> dispatchers,
|
| buffer_.get() + handle_table_start_offset);
|
| size_t current_offset = serialized_dispatcher_start_offset;
|
| for (size_t i = 0; i < num_handles; i++) {
|
| - Dispatcher* dispatcher = (*dispatchers)[i].get();
|
| - if (!dispatcher) {
|
| + Handle& handle = handles->at(i);
|
| + if (!handle) {
|
| static_assert(static_cast<int32_t>(Dispatcher::Type::UNKNOWN) == 0,
|
| "Value of Dispatcher::Type::UNKNOWN must be 0");
|
| continue;
|
| @@ -174,12 +153,12 @@ TransportData::TransportData(std::unique_ptr<DispatcherVector> dispatchers,
|
| void* destination = buffer_.get() + current_offset;
|
| size_t actual_size = 0;
|
| if (Dispatcher::TransportDataAccess::EndSerializeAndClose(
|
| - dispatcher, channel, destination, &actual_size,
|
| + handle.dispatcher.get(), channel, destination, &actual_size,
|
| platform_handles_.get())) {
|
| - handle_table[i].type = static_cast<int32_t>(dispatcher->GetType());
|
| + handle_table[i].type = static_cast<int32_t>(handle.dispatcher->GetType());
|
| handle_table[i].offset = static_cast<uint32_t>(current_offset);
|
| handle_table[i].size = static_cast<uint32_t>(actual_size);
|
| -// (Okay to not set |unused| since we cleared the entire buffer.)
|
| + handle_table[i].rights = handle.rights;
|
|
|
| #if DCHECK_IS_ON()
|
| DCHECK_LE(actual_size, all_max_sizes[i]);
|
| @@ -212,8 +191,6 @@ TransportData::TransportData(std::unique_ptr<DispatcherVector> dispatchers,
|
| // There's no aligned realloc, so it's no good way to release unused space (if
|
| // we overshot our estimated space requirements).
|
| buffer_size_ = current_offset;
|
| -
|
| - // |dispatchers_| will be destroyed as it goes out of scope.
|
| }
|
|
|
| TransportData::TransportData(
|
| @@ -331,7 +308,7 @@ void TransportData::GetPlatformHandleTable(const void* transport_data_buffer,
|
| }
|
|
|
| // static
|
| -std::unique_ptr<DispatcherVector> TransportData::DeserializeDispatchers(
|
| +std::unique_ptr<HandleVector> TransportData::DeserializeHandles(
|
| const void* buffer,
|
| size_t buffer_size,
|
| std::unique_ptr<std::vector<ScopedPlatformHandle>> platform_handles,
|
| @@ -342,8 +319,7 @@ std::unique_ptr<DispatcherVector> TransportData::DeserializeDispatchers(
|
|
|
| const Header* header = static_cast<const Header*>(buffer);
|
| const size_t num_handles = header->num_handles;
|
| - std::unique_ptr<DispatcherVector> dispatchers(
|
| - new DispatcherVector(num_handles));
|
| + std::unique_ptr<HandleVector> handles(new HandleVector(num_handles));
|
|
|
| const HandleTableEntry* handle_table =
|
| reinterpret_cast<const HandleTableEntry*>(
|
| @@ -357,11 +333,13 @@ std::unique_ptr<DispatcherVector> TransportData::DeserializeDispatchers(
|
| DCHECK_LE(offset + size, buffer_size);
|
|
|
| const void* source = static_cast<const char*>(buffer) + offset;
|
| - (*dispatchers)[i] = Dispatcher::TransportDataAccess::Deserialize(
|
| - channel, handle_table[i].type, source, size, platform_handles.get());
|
| + (*handles)[i] = Handle(Dispatcher::TransportDataAccess::Deserialize(
|
| + channel, handle_table[i].type, source, size,
|
| + platform_handles.get()),
|
| + handle_table[i].rights);
|
| }
|
|
|
| - return dispatchers;
|
| + return handles;
|
| }
|
|
|
| } // namespace system
|
|
|