|  | /* | 
|  | * Copyright (C) 2018 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef ANDROID_BUFFER_HUB_METADATA_H_ | 
|  | #define ANDROID_BUFFER_HUB_METADATA_H_ | 
|  |  | 
|  | #include <android-base/unique_fd.h> | 
|  | #include <ui/BufferHubDefs.h> | 
|  |  | 
|  | namespace android { | 
|  |  | 
|  | namespace { | 
|  | using base::unique_fd; | 
|  | } // namespace | 
|  |  | 
|  | class BufferHubMetadata { | 
|  | public: | 
|  | // Creates a new BufferHubMetadata backed by an ashmem region. | 
|  | // | 
|  | // @param userMetadataSize Size in bytes of the user defined metadata. The entire metadata | 
|  | //        shared memory region to be allocated is the size of canonical | 
|  | //        BufferHubDefs::MetadataHeader plus userMetadataSize. | 
|  | static BufferHubMetadata create(size_t userMetadataSize); | 
|  |  | 
|  | // Imports an existing BufferHubMetadata from an ashmem FD. | 
|  | // | 
|  | // @param ashmemFd Ashmem file descriptor representing an ashmem region. | 
|  | static BufferHubMetadata import(unique_fd ashmemFd); | 
|  |  | 
|  | BufferHubMetadata() = default; | 
|  |  | 
|  | BufferHubMetadata(BufferHubMetadata&& other) { *this = std::move(other); } | 
|  |  | 
|  | ~BufferHubMetadata(); | 
|  |  | 
|  | BufferHubMetadata& operator=(BufferHubMetadata&& other) { | 
|  | if (this != &other) { | 
|  | mUserMetadataSize = other.mUserMetadataSize; | 
|  | other.mUserMetadataSize = 0; | 
|  |  | 
|  | mAshmemFd = std::move(other.mAshmemFd); | 
|  |  | 
|  | // The old raw mMetadataHeader pointer must be cleared, otherwise the destructor will | 
|  | // automatically mummap() the shared memory. | 
|  | mMetadataHeader = other.mMetadataHeader; | 
|  | other.mMetadataHeader = nullptr; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | // Returns true if the metadata is valid, i.e. the metadata has a valid ashmem fd and the ashmem | 
|  | // has been mapped into virtual address space. | 
|  | bool isValid() const { return mAshmemFd.get() != -1 && mMetadataHeader != nullptr; } | 
|  |  | 
|  | size_t userMetadataSize() const { return mUserMetadataSize; } | 
|  | size_t metadataSize() const { return mUserMetadataSize + BufferHubDefs::kMetadataHeaderSize; } | 
|  |  | 
|  | const unique_fd& ashmemFd() const { return mAshmemFd; } | 
|  | BufferHubDefs::MetadataHeader* metadataHeader() { return mMetadataHeader; } | 
|  |  | 
|  | private: | 
|  | BufferHubMetadata(size_t userMetadataSize, unique_fd ashmemFd, | 
|  | BufferHubDefs::MetadataHeader* metadataHeader); | 
|  |  | 
|  | BufferHubMetadata(const BufferHubMetadata&) = delete; | 
|  | void operator=(const BufferHubMetadata&) = delete; | 
|  |  | 
|  | size_t mUserMetadataSize = 0; | 
|  | unique_fd mAshmemFd; | 
|  | BufferHubDefs::MetadataHeader* mMetadataHeader = nullptr; | 
|  | }; | 
|  |  | 
|  | } // namespace android | 
|  |  | 
|  | #endif // ANDROID_BUFFER_HUB_METADATA_H_ |