Index: app/surface/transport_dib_mac.cc |
diff --git a/app/surface/transport_dib_mac.cc b/app/surface/transport_dib_mac.cc |
index a3eb0bb23075401ff1ddd9768c226a0e5b61ca53..68ccfca4755a6bbf12f6df3b68e1e9e1651526dc 100644 |
--- a/app/surface/transport_dib_mac.cc |
+++ b/app/surface/transport_dib_mac.cc |
@@ -13,6 +13,11 @@ |
#include "base/shared_memory.h" |
#include "skia/ext/platform_canvas.h" |
+void TransportDIB::ScopedHandle::Close() { |
+ if (is_valid(handle_)) |
+ base::SharedMemory::CloseHandle(handle_); |
+} |
Scott Hess - ex-Googler
2010/10/25 21:38:19
AFAICT, handle_ is a file descriptor, and since th
kkania
2010/10/27 18:12:59
That is correct. However, since Close() is private
Scott Hess - ex-Googler
2010/10/27 19:34:02
Not if you happen to be multi-threaded.
|
+ |
TransportDIB::TransportDIB() |
: size_(0) { |
} |
@@ -34,46 +39,56 @@ TransportDIB* TransportDIB::Create(size_t size, uint32 sequence_num) { |
return NULL; |
} |
- if (!dib->shared_memory_.Map(size)) { |
- delete dib; |
- return NULL; |
- } |
- |
dib->size_ = size; |
return dib; |
} |
// static |
-TransportDIB* TransportDIB::Map(TransportDIB::Handle handle) { |
- if (!is_valid(handle)) |
+TransportDIB* TransportDIB::Map(Handle handle) { |
+ scoped_ptr<TransportDIB> dib(CreateWithHandle(handle)); |
+ if (!dib->Map()) |
return NULL; |
+ return dib.release(); |
+} |
- TransportDIB* dib = new TransportDIB(handle); |
- struct stat st; |
- if ((fstat(handle.fd, &st) != 0) || |
- (!dib->shared_memory_.Map(st.st_size))) { |
- delete dib; |
- if (HANDLE_EINTR(close(handle.fd)) < 0) |
- PLOG(ERROR) << "close"; |
- return NULL; |
- } |
- |
- dib->size_ = st.st_size; |
- |
- return dib; |
+// static |
+TransportDIB* TransportDIB::CreateWithHandle(Handle handle) { |
+ return new TransportDIB(handle); |
} |
+// static |
bool TransportDIB::is_valid(Handle dib) { |
return dib.fd >= 0; |
} |
skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { |
+ if (!memory() && !Map()) |
+ return NULL; |
scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); |
if (!canvas->initialize(w, h, true, reinterpret_cast<uint8_t*>(memory()))) |
return NULL; |
return canvas.release(); |
} |
+bool TransportDIB::Map() { |
+ if (memory()) |
+ return true; |
+ |
+ struct stat st; |
+ if ((fstat(shared_memory_.handle().fd, &st) != 0) || |
+ (!shared_memory_.Map(st.st_size))) { |
+ return false; |
+ } |
+ |
+ size_ = st.st_size; |
+ return true; |
+} |
+ |
+TransportDIB::Handle TransportDIB::GetHandleForProcess( |
+ base::ProcessHandle process_handle) const { |
+ return handle(); |
+} |
+ |
void* TransportDIB::memory() const { |
return shared_memory_.memory(); |
} |