| /* |
| * 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_ |