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

Side by Side Diff: mojo/system/shared_buffer_dispatcher.cc

Issue 471773002: Mojo: Add a platform interface for shared memory (embedder::PlatformSharedBuffer). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win fix Created 6 years, 4 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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/system/shared_buffer_dispatcher.h" 5 #include "mojo/system/shared_buffer_dispatcher.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 // static 63 // static
64 MojoResult SharedBufferDispatcher::Create( 64 MojoResult SharedBufferDispatcher::Create(
65 const MojoCreateSharedBufferOptions& /*validated_options*/, 65 const MojoCreateSharedBufferOptions& /*validated_options*/,
66 uint64_t num_bytes, 66 uint64_t num_bytes,
67 scoped_refptr<SharedBufferDispatcher>* result) { 67 scoped_refptr<SharedBufferDispatcher>* result) {
68 if (!num_bytes) 68 if (!num_bytes)
69 return MOJO_RESULT_INVALID_ARGUMENT; 69 return MOJO_RESULT_INVALID_ARGUMENT;
70 if (num_bytes > kMaxSharedMemoryNumBytes) 70 if (num_bytes > kMaxSharedMemoryNumBytes)
71 return MOJO_RESULT_RESOURCE_EXHAUSTED; 71 return MOJO_RESULT_RESOURCE_EXHAUSTED;
72 72
73 scoped_refptr<RawSharedBuffer> shared_buffer( 73 // TODO(vtl): Call out to "platform support" for this.
74 scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer(
74 RawSharedBuffer::Create(static_cast<size_t>(num_bytes))); 75 RawSharedBuffer::Create(static_cast<size_t>(num_bytes)));
75 if (!shared_buffer) 76 if (!shared_buffer)
76 return MOJO_RESULT_RESOURCE_EXHAUSTED; 77 return MOJO_RESULT_RESOURCE_EXHAUSTED;
77 78
78 *result = new SharedBufferDispatcher(shared_buffer); 79 *result = new SharedBufferDispatcher(shared_buffer);
79 return MOJO_RESULT_OK; 80 return MOJO_RESULT_OK;
80 } 81 }
81 82
82 Dispatcher::Type SharedBufferDispatcher::GetType() const { 83 Dispatcher::Type SharedBufferDispatcher::GetType() const {
83 return kTypeSharedBuffer; 84 return kTypeSharedBuffer;
(...skipping 28 matching lines...) Expand all
112 } 113 }
113 114
114 // Starts off invalid, which is what we want. 115 // Starts off invalid, which is what we want.
115 embedder::PlatformHandle platform_handle; 116 embedder::PlatformHandle platform_handle;
116 // We take ownership of the handle, so we have to invalidate the one in 117 // We take ownership of the handle, so we have to invalidate the one in
117 // |platform_handles|. 118 // |platform_handles|.
118 std::swap(platform_handle, (*platform_handles)[platform_handle_index]); 119 std::swap(platform_handle, (*platform_handles)[platform_handle_index]);
119 120
120 // Wrapping |platform_handle| in a |ScopedPlatformHandle| means that it'll be 121 // Wrapping |platform_handle| in a |ScopedPlatformHandle| means that it'll be
121 // closed even if creation fails. 122 // closed even if creation fails.
122 scoped_refptr<RawSharedBuffer> shared_buffer( 123 scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer(
123 RawSharedBuffer::CreateFromPlatformHandle( 124 RawSharedBuffer::CreateFromPlatformHandle(
124 num_bytes, embedder::ScopedPlatformHandle(platform_handle))); 125 num_bytes, embedder::ScopedPlatformHandle(platform_handle)));
125 if (!shared_buffer) { 126 if (!shared_buffer) {
126 LOG(ERROR) 127 LOG(ERROR)
127 << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)"; 128 << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)";
128 return scoped_refptr<SharedBufferDispatcher>(); 129 return scoped_refptr<SharedBufferDispatcher>();
129 } 130 }
130 131
131 return scoped_refptr<SharedBufferDispatcher>( 132 return scoped_refptr<SharedBufferDispatcher>(
132 new SharedBufferDispatcher(shared_buffer)); 133 new SharedBufferDispatcher(shared_buffer));
133 } 134 }
134 135
135 SharedBufferDispatcher::SharedBufferDispatcher( 136 SharedBufferDispatcher::SharedBufferDispatcher(
136 scoped_refptr<RawSharedBuffer> shared_buffer) 137 scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer)
137 : shared_buffer_(shared_buffer) { 138 : shared_buffer_(shared_buffer) {
138 DCHECK(shared_buffer_); 139 DCHECK(shared_buffer_);
139 } 140 }
140 141
141 SharedBufferDispatcher::~SharedBufferDispatcher() { 142 SharedBufferDispatcher::~SharedBufferDispatcher() {
142 } 143 }
143 144
144 // static 145 // static
145 MojoResult SharedBufferDispatcher::ValidateDuplicateOptions( 146 MojoResult SharedBufferDispatcher::ValidateDuplicateOptions(
146 UserPointer<const MojoDuplicateBufferHandleOptions> in_options, 147 UserPointer<const MojoDuplicateBufferHandleOptions> in_options,
(...skipping 29 matching lines...) Expand all
176 void SharedBufferDispatcher::CloseImplNoLock() { 177 void SharedBufferDispatcher::CloseImplNoLock() {
177 lock().AssertAcquired(); 178 lock().AssertAcquired();
178 DCHECK(shared_buffer_); 179 DCHECK(shared_buffer_);
179 shared_buffer_ = NULL; 180 shared_buffer_ = NULL;
180 } 181 }
181 182
182 scoped_refptr<Dispatcher> 183 scoped_refptr<Dispatcher>
183 SharedBufferDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { 184 SharedBufferDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() {
184 lock().AssertAcquired(); 185 lock().AssertAcquired();
185 DCHECK(shared_buffer_); 186 DCHECK(shared_buffer_);
186 scoped_refptr<RawSharedBuffer> shared_buffer; 187 scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer;
187 shared_buffer.swap(shared_buffer_); 188 shared_buffer.swap(shared_buffer_);
188 return scoped_refptr<Dispatcher>(new SharedBufferDispatcher(shared_buffer)); 189 return scoped_refptr<Dispatcher>(new SharedBufferDispatcher(shared_buffer));
189 } 190 }
190 191
191 MojoResult SharedBufferDispatcher::DuplicateBufferHandleImplNoLock( 192 MojoResult SharedBufferDispatcher::DuplicateBufferHandleImplNoLock(
192 UserPointer<const MojoDuplicateBufferHandleOptions> options, 193 UserPointer<const MojoDuplicateBufferHandleOptions> options,
193 scoped_refptr<Dispatcher>* new_dispatcher) { 194 scoped_refptr<Dispatcher>* new_dispatcher) {
194 lock().AssertAcquired(); 195 lock().AssertAcquired();
195 196
196 MojoDuplicateBufferHandleOptions validated_options; 197 MojoDuplicateBufferHandleOptions validated_options;
197 MojoResult result = ValidateDuplicateOptions(options, &validated_options); 198 MojoResult result = ValidateDuplicateOptions(options, &validated_options);
198 if (result != MOJO_RESULT_OK) 199 if (result != MOJO_RESULT_OK)
199 return result; 200 return result;
200 201
201 *new_dispatcher = new SharedBufferDispatcher(shared_buffer_); 202 *new_dispatcher = new SharedBufferDispatcher(shared_buffer_);
202 return MOJO_RESULT_OK; 203 return MOJO_RESULT_OK;
203 } 204 }
204 205
205 MojoResult SharedBufferDispatcher::MapBufferImplNoLock( 206 MojoResult SharedBufferDispatcher::MapBufferImplNoLock(
206 uint64_t offset, 207 uint64_t offset,
207 uint64_t num_bytes, 208 uint64_t num_bytes,
208 MojoMapBufferFlags flags, 209 MojoMapBufferFlags flags,
209 scoped_ptr<RawSharedBufferMapping>* mapping) { 210 scoped_ptr<embedder::PlatformSharedBufferMapping>* mapping) {
210 lock().AssertAcquired(); 211 lock().AssertAcquired();
211 DCHECK(shared_buffer_); 212 DCHECK(shared_buffer_);
212 213
213 if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max())) 214 if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
214 return MOJO_RESULT_INVALID_ARGUMENT; 215 return MOJO_RESULT_INVALID_ARGUMENT;
215 if (num_bytes > static_cast<uint64_t>(std::numeric_limits<size_t>::max())) 216 if (num_bytes > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
216 return MOJO_RESULT_INVALID_ARGUMENT; 217 return MOJO_RESULT_INVALID_ARGUMENT;
217 218
218 if (!shared_buffer_->IsValidMap(static_cast<size_t>(offset), 219 if (!shared_buffer_->IsValidMap(static_cast<size_t>(offset),
219 static_cast<size_t>(num_bytes))) 220 static_cast<size_t>(num_bytes)))
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 // one else can make any more references to it), so we can just take its 252 // one else can make any more references to it), so we can just take its
252 // handle. 253 // handle.
253 embedder::ScopedPlatformHandle platform_handle( 254 embedder::ScopedPlatformHandle platform_handle(
254 shared_buffer_->HasOneRef() ? shared_buffer_->PassPlatformHandle() 255 shared_buffer_->HasOneRef() ? shared_buffer_->PassPlatformHandle()
255 : shared_buffer_->DuplicatePlatformHandle()); 256 : shared_buffer_->DuplicatePlatformHandle());
256 if (!platform_handle.is_valid()) { 257 if (!platform_handle.is_valid()) {
257 shared_buffer_ = NULL; 258 shared_buffer_ = NULL;
258 return false; 259 return false;
259 } 260 }
260 261
261 serialization->num_bytes = shared_buffer_->num_bytes(); 262 serialization->num_bytes = shared_buffer_->GetNumBytes();
262 serialization->platform_handle_index = platform_handles->size(); 263 serialization->platform_handle_index = platform_handles->size();
263 platform_handles->push_back(platform_handle.release()); 264 platform_handles->push_back(platform_handle.release());
264 *actual_size = sizeof(SerializedSharedBufferDispatcher); 265 *actual_size = sizeof(SerializedSharedBufferDispatcher);
265 266
266 shared_buffer_ = NULL; 267 shared_buffer_ = NULL;
267 268
268 return true; 269 return true;
269 } 270 }
270 271
271 } // namespace system 272 } // namespace system
272 } // namespace mojo 273 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/shared_buffer_dispatcher.h ('k') | mojo/system/shared_buffer_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698