| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "mojo/edk/system/platform_handle_dispatcher.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 | |
| 11 namespace mojo { | |
| 12 namespace system { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 const size_t kInvalidPlatformHandleIndex = static_cast<size_t>(-1); | |
| 17 | |
| 18 struct SerializedPlatformHandleDispatcher { | |
| 19 size_t platform_handle_index; // (Or |kInvalidPlatformHandleIndex|.) | |
| 20 }; | |
| 21 | |
| 22 } // namespace | |
| 23 | |
| 24 PlatformHandleDispatcher::PlatformHandleDispatcher( | |
| 25 embedder::ScopedPlatformHandle platform_handle) | |
| 26 : platform_handle_(platform_handle.Pass()) { | |
| 27 } | |
| 28 | |
| 29 embedder::ScopedPlatformHandle PlatformHandleDispatcher::PassPlatformHandle() { | |
| 30 base::AutoLock locker(lock()); | |
| 31 return platform_handle_.Pass(); | |
| 32 } | |
| 33 | |
| 34 Dispatcher::Type PlatformHandleDispatcher::GetType() const { | |
| 35 return kTypePlatformHandle; | |
| 36 } | |
| 37 | |
| 38 // static | |
| 39 scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Deserialize( | |
| 40 Channel* channel, | |
| 41 const void* source, | |
| 42 size_t size, | |
| 43 embedder::PlatformHandleVector* platform_handles) { | |
| 44 if (size != sizeof(SerializedPlatformHandleDispatcher)) { | |
| 45 LOG(ERROR) << "Invalid serialized platform handle dispatcher (bad size)"; | |
| 46 return nullptr; | |
| 47 } | |
| 48 | |
| 49 const SerializedPlatformHandleDispatcher* serialization = | |
| 50 static_cast<const SerializedPlatformHandleDispatcher*>(source); | |
| 51 size_t platform_handle_index = serialization->platform_handle_index; | |
| 52 | |
| 53 // Starts off invalid, which is what we want. | |
| 54 embedder::PlatformHandle platform_handle; | |
| 55 | |
| 56 if (platform_handle_index != kInvalidPlatformHandleIndex) { | |
| 57 if (!platform_handles || | |
| 58 platform_handle_index >= platform_handles->size()) { | |
| 59 LOG(ERROR) | |
| 60 << "Invalid serialized platform handle dispatcher (missing handles)"; | |
| 61 return nullptr; | |
| 62 } | |
| 63 | |
| 64 // We take ownership of the handle, so we have to invalidate the one in | |
| 65 // |platform_handles|. | |
| 66 std::swap(platform_handle, (*platform_handles)[platform_handle_index]); | |
| 67 } | |
| 68 | |
| 69 return scoped_refptr<PlatformHandleDispatcher>(new PlatformHandleDispatcher( | |
| 70 embedder::ScopedPlatformHandle(platform_handle))); | |
| 71 } | |
| 72 | |
| 73 PlatformHandleDispatcher::~PlatformHandleDispatcher() { | |
| 74 } | |
| 75 | |
| 76 void PlatformHandleDispatcher::CloseImplNoLock() { | |
| 77 lock().AssertAcquired(); | |
| 78 platform_handle_.reset(); | |
| 79 } | |
| 80 | |
| 81 scoped_refptr<Dispatcher> | |
| 82 PlatformHandleDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { | |
| 83 lock().AssertAcquired(); | |
| 84 return scoped_refptr<Dispatcher>( | |
| 85 new PlatformHandleDispatcher(platform_handle_.Pass())); | |
| 86 } | |
| 87 | |
| 88 void PlatformHandleDispatcher::StartSerializeImplNoLock( | |
| 89 Channel* /*channel*/, | |
| 90 size_t* max_size, | |
| 91 size_t* max_platform_handles) { | |
| 92 DCHECK(HasOneRef()); // Only one ref => no need to take the lock. | |
| 93 *max_size = sizeof(SerializedPlatformHandleDispatcher); | |
| 94 *max_platform_handles = 1; | |
| 95 } | |
| 96 | |
| 97 bool PlatformHandleDispatcher::EndSerializeAndCloseImplNoLock( | |
| 98 Channel* /*channel*/, | |
| 99 void* destination, | |
| 100 size_t* actual_size, | |
| 101 embedder::PlatformHandleVector* platform_handles) { | |
| 102 DCHECK(HasOneRef()); // Only one ref => no need to take the lock. | |
| 103 | |
| 104 SerializedPlatformHandleDispatcher* serialization = | |
| 105 static_cast<SerializedPlatformHandleDispatcher*>(destination); | |
| 106 if (platform_handle_.is_valid()) { | |
| 107 serialization->platform_handle_index = platform_handles->size(); | |
| 108 platform_handles->push_back(platform_handle_.release()); | |
| 109 } else { | |
| 110 serialization->platform_handle_index = kInvalidPlatformHandleIndex; | |
| 111 } | |
| 112 | |
| 113 *actual_size = sizeof(SerializedPlatformHandleDispatcher); | |
| 114 return true; | |
| 115 } | |
| 116 | |
| 117 } // namespace system | |
| 118 } // namespace mojo | |
| OLD | NEW |