Index: base/files/scoped_platform_handle.h |
diff --git a/base/files/scoped_platform_handle.h b/base/files/scoped_platform_handle.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cfff5a7146bfba770efaa380abdabf3313f730d3 |
--- /dev/null |
+++ b/base/files/scoped_platform_handle.h |
@@ -0,0 +1,75 @@ |
+// 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. |
+ |
+#ifndef BASE_FILES_SCOPED_PLATFORM_HANDLE_H_ |
+#define BASE_FILES_SCOPED_PLATFORM_HANDLE_H_ |
+ |
+#include <stddef.h> |
+#include <stdint.h> |
+ |
+#include "base/base_export.h" |
+#include "build/build_config.h" |
+ |
+#if defined(OS_WIN) |
+#include <windows.h> |
+ |
+#include "base/win/scoped_handle.h" |
+#elif defined(OS_POSIX) |
+#include "base/files/scoped_file.h" |
+#endif |
+ |
+namespace base { |
+ |
+// A ScopedPlatformHandle encapsulates ownership of either a Windows handle or |
+// a POSIX file descriptor, while presenting a common interface for the sake |
+// of simple, consistent, and safe ownership semantics. Platform-specific usage |
+// details are thus relegated to code which either acquires or uses the |
+// underlying platform resource. |
+class BASE_EXPORT ScopedPlatformHandle { |
+ public: |
+#if defined(OS_WIN) |
+ using HandleType = HANDLE; |
+ using ScopedHandleType = win::ScopedHandle; |
+#elif defined(OS_POSIX) |
+ using HandleType = int; |
+ using ScopedHandleType = ScopedFD; |
+#endif |
+ |
+ // Constructors for an invalid ScopedPlatformHandle. |
+ ScopedPlatformHandle(); |
+ ScopedPlatformHandle(std::nullptr_t); |
+ |
+ ScopedPlatformHandle(ScopedPlatformHandle&& other); |
+ |
+ // These constructors always take ownership of the given handle. |
+ explicit ScopedPlatformHandle(HandleType handle); |
+ explicit ScopedPlatformHandle(ScopedHandleType handle); |
+ |
+ ~ScopedPlatformHandle(); |
+ |
+ ScopedPlatformHandle& operator=(ScopedPlatformHandle&& other); |
+ |
+ // Indicates whether this ScopedPlatformHandle is holding a valid handle. |
+ bool is_valid() const; |
+ |
+ // Closes the handle. |
+ void reset(); |
+ |
+ // Returns the platform-specific handle value. |
+ HandleType get() const; |
+ |
+ // Returns the platform-specific handle value, releasing ownership of the |
+ // handle. |
+ HandleType release(); |
+ |
+ // Transfers ownership of the handle to a platform-specific scoper. |
+ ScopedHandleType Take(); |
+ |
+ private: |
+ ScopedHandleType handle_; |
+}; |
+ |
+} // namespace base |
+ |
+#endif // BASE_FILES_SCOPED_PLATFORM_HANDLE_H_ |