Index: base/memory/shared_memory_handle_posix.cc |
diff --git a/base/memory/shared_memory_handle_posix.cc b/base/memory/shared_memory_handle_posix.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8904402a3711027790c220aa35e9b4985577b451 |
--- /dev/null |
+++ b/base/memory/shared_memory_handle_posix.cc |
@@ -0,0 +1,57 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/shared_memory_handle.h" |
+ |
+#include <unistd.h> |
+ |
+#include "base/logging.h" |
+#include "base/posix/eintr_wrapper.h" |
+ |
+namespace base { |
+ |
+SharedMemoryHandle::SharedMemoryHandle() = default; |
+ |
+SharedMemoryHandle::SharedMemoryHandle( |
+ const base::FileDescriptor& file_descriptor) |
+ : file_descriptor(file_descriptor) {} |
+ |
+// static |
+SharedMemoryHandle SharedMemoryHandle::ImportHandle(int fd) { |
+ SharedMemoryHandle handle; |
+ handle.file_descriptor.fd = fd; |
+ handle.file_descriptor.auto_close = true; |
+ return handle; |
+} |
+ |
+int SharedMemoryHandle::GetHandle() const { |
+ return file_descriptor.fd; |
+} |
+ |
+bool SharedMemoryHandle::IsValid() const { |
+ return file_descriptor.fd >= 0; |
+} |
+ |
+void SharedMemoryHandle::Close() const { |
+ if (IGNORE_EINTR(close(file_descriptor.fd)) < 0) |
+ PLOG(ERROR) << "close"; |
+} |
+ |
+int SharedMemoryHandle::Release() { |
+ int old_fd = file_descriptor.fd; |
+ file_descriptor.fd = -1; |
+ return old_fd; |
+} |
+ |
+SharedMemoryHandle SharedMemoryHandle::Duplicate() const { |
+ if (!IsValid()) |
+ return SharedMemoryHandle(); |
+ |
+ int duped_handle = HANDLE_EINTR(dup(file_descriptor.fd)); |
+ if (duped_handle < 0) |
+ return SharedMemoryHandle(); |
+ return SharedMemoryHandle(FileDescriptor(duped_handle, true)); |
+} |
+ |
+} // namespace base |