Index: gpu/command_buffer/service/command_buffer_service.cc |
=================================================================== |
--- gpu/command_buffer/service/command_buffer_service.cc (revision 75655) |
+++ gpu/command_buffer/service/command_buffer_service.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include <limits> |
#include "base/callback.h" |
+#include "base/process_util.h" |
#include "gpu/command_buffer/common/cmd_buffer_common.h" |
using ::base::SharedMemory; |
@@ -20,10 +21,14 @@ |
token_(0), |
error_(error::kNoError) { |
// Element zero is always NULL. |
- registered_objects_.push_back(linked_ptr<SharedMemory>()); |
+ registered_objects_.push_back(Buffer()); |
} |
CommandBufferService::~CommandBufferService() { |
+ for (size_t i = 0; i < registered_objects_.size(); ++i) { |
+ if (registered_objects_[i].shared_memory) |
+ delete registered_objects_[i].shared_memory; |
+ } |
} |
bool CommandBufferService::Initialize(int32 size) { |
@@ -102,10 +107,27 @@ |
} |
int32 CommandBufferService::CreateTransferBuffer(size_t size) { |
- linked_ptr<SharedMemory> buffer(new SharedMemory); |
- if (!buffer->CreateAnonymous(size)) |
+ SharedMemory buffer; |
+ if (!buffer.CreateAnonymous(size)) |
return -1; |
+ return RegisterTransferBuffer(&buffer, size); |
+} |
+ |
+int32 CommandBufferService::RegisterTransferBuffer( |
+ base::SharedMemory* shared_memory, size_t size) { |
+ // Duplicate the handle. |
+ base::SharedMemoryHandle shared_memory_handle; |
+ if (!shared_memory->ShareToProcess(base::GetCurrentProcessHandle(), |
+ &shared_memory_handle)) { |
+ return -1; |
+ } |
+ |
+ Buffer buffer; |
+ buffer.ptr = NULL; |
+ buffer.size = size; |
+ buffer.shared_memory = new SharedMemory(shared_memory_handle, false); |
+ |
if (unused_registered_object_elements_.empty()) { |
// Check we haven't exceeded the range that fits in a 32-bit integer. |
if (registered_objects_.size() > std::numeric_limits<uint32>::max()) |
@@ -119,7 +141,7 @@ |
int32 handle = *unused_registered_object_elements_.begin(); |
unused_registered_object_elements_.erase( |
unused_registered_object_elements_.begin()); |
- DCHECK(!registered_objects_[handle].get()); |
+ DCHECK(!registered_objects_[handle].shared_memory); |
registered_objects_[handle] = buffer; |
return handle; |
} |
@@ -131,13 +153,15 @@ |
if (static_cast<size_t>(handle) >= registered_objects_.size()) |
return; |
- registered_objects_[handle].reset(); |
+ delete registered_objects_[handle].shared_memory; |
+ registered_objects_[handle] = Buffer(); |
unused_registered_object_elements_.insert(handle); |
// Remove all null objects from the end of the vector. This allows the vector |
// to shrink when, for example, all objects are unregistered. Note that this |
// loop never removes element zero, which is always NULL. |
- while (registered_objects_.size() > 1 && !registered_objects_.back().get()) { |
+ while (registered_objects_.size() > 1 && |
+ !registered_objects_.back().shared_memory) { |
registered_objects_.pop_back(); |
unused_registered_object_elements_.erase( |
static_cast<int32>(registered_objects_.size())); |
@@ -151,19 +175,16 @@ |
if (static_cast<size_t>(handle) >= registered_objects_.size()) |
return Buffer(); |
- base::SharedMemory* shared_memory = registered_objects_[handle].get(); |
- if (!shared_memory) |
- return Buffer(); |
+ Buffer buffer = registered_objects_[handle]; |
+ if (!buffer.shared_memory) |
+ return Buffer(); |
- if (!shared_memory->memory()) { |
- if (!shared_memory->Map(shared_memory->created_size())) |
+ if (!buffer.shared_memory->memory()) { |
+ if (!buffer.shared_memory->Map(buffer.size)) |
return Buffer(); |
} |
- Buffer buffer; |
- buffer.ptr = shared_memory->memory(); |
- buffer.size = shared_memory->created_size(); |
- buffer.shared_memory = shared_memory; |
+ buffer.ptr = buffer.shared_memory->memory(); |
return buffer; |
} |