| // Copyright 2018 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_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_ | 
 | #define BASE_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_ | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/files/scoped_file.h" | 
 | #include "base/macros.h" | 
 |  | 
 | extern "C" typedef struct AHardwareBuffer AHardwareBuffer; | 
 |  | 
 | namespace base { | 
 | namespace android { | 
 |  | 
 | // Owns a single reference to an AHardwareBuffer object. | 
 | class BASE_EXPORT ScopedHardwareBufferHandle { | 
 |  public: | 
 |   ScopedHardwareBufferHandle(); | 
 |  | 
 |   // Takes ownership of |other|'s buffer reference. Does NOT acquire a new one. | 
 |   ScopedHardwareBufferHandle(ScopedHardwareBufferHandle&& other); | 
 |  | 
 |   // Releases this handle's reference to the underlying buffer object if still | 
 |   // valid. | 
 |   ~ScopedHardwareBufferHandle(); | 
 |  | 
 |   // Assumes ownership of an existing reference to |buffer|. This does NOT | 
 |   // acquire a new reference. | 
 |   static ScopedHardwareBufferHandle Adopt(AHardwareBuffer* buffer); | 
 |  | 
 |   // Takes ownership of |other|'s buffer reference. Does NOT acquire a new one. | 
 |   ScopedHardwareBufferHandle& operator=(ScopedHardwareBufferHandle&& other); | 
 |  | 
 |   bool is_valid() const; | 
 |  | 
 |   AHardwareBuffer* get() const; | 
 |  | 
 |   // Releases this handle's reference to the underlying buffer object if still | 
 |   // valid. Invalidates this handle. | 
 |   void reset(); | 
 |  | 
 |   // Passes implicit ownership of this handle's reference over to the caller, | 
 |   // invalidating |this|. Returns the raw buffer handle. | 
 |   // | 
 |   // The caller is responsible for eventually releasing this reference to the | 
 |   // buffer object. | 
 |   AHardwareBuffer* Take() WARN_UNUSED_RESULT; | 
 |  | 
 |   // Creates a new handle with its own newly acquired reference to the | 
 |   // underlying buffer object. |this| must be a valid handle. | 
 |   ScopedHardwareBufferHandle Clone() const; | 
 |  | 
 |   // Consumes a handle and returns a file descriptor which can be used to | 
 |   // transmit the handle over IPC. A subsequent receiver may use | 
 |   // |DeserializeFromFileDescriptor()| to recover the buffer handle. | 
 |   // | 
 |   // NOTE: The returned file descriptor DOES NOT own a reference to the | 
 |   // underlying AHardwareBuffer. When using this for IPC, the caller is | 
 |   // responsible for retaining at least one reference to the buffer object to | 
 |   // keep it alive while the descriptor is in transit. | 
 |   ScopedFD SerializeAsFileDescriptor() const; | 
 |  | 
 |   // Consumes the supplied single-use file descriptor (which must have been | 
 |   // returned by a previous call to |SerializeAsFileDescriptor()|, perhaps in | 
 |   // a different process), and recovers an AHardwareBuffer object from it. | 
 |   // | 
 |   // This acquires a new reference to the AHardwareBuffer, with ownership passed | 
 |   // to the caller via the returned ScopedHardwareBufferHandle. | 
 |   static ScopedHardwareBufferHandle DeserializeFromFileDescriptor(ScopedFD fd) | 
 |       WARN_UNUSED_RESULT; | 
 |  | 
 |  private: | 
 |   // Assumes ownership of an existing reference to |buffer|. This does NOT | 
 |   // acquire a new reference. | 
 |   explicit ScopedHardwareBufferHandle(AHardwareBuffer* buffer); | 
 |  | 
 |   AHardwareBuffer* buffer_ = nullptr; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopedHardwareBufferHandle); | 
 | }; | 
 |  | 
 | }  // namespace android | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_ |