| // Copyright 2019 The Fuchsia 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 MSD_IMG_SEMAPHORE_H |
| #define MSD_IMG_SEMAPHORE_H |
| |
| #include "magma_util/macros.h" |
| #include "msd.h" |
| #include "platform_semaphore.h" |
| |
| class MsdImgSemaphore |
| { |
| public: |
| static std::unique_ptr<MsdImgSemaphore> Import(uint32_t handle); |
| static std::unique_ptr<MsdImgSemaphore> Create(); |
| |
| MsdImgSemaphore(std::unique_ptr<magma::PlatformSemaphore> platform_semaphore); |
| |
| ~MsdImgSemaphore(); |
| |
| magma::PlatformSemaphore* platform_semaphore() |
| { |
| DASSERT(platform_semaphore_); |
| return platform_semaphore_.get(); |
| } |
| |
| private: |
| std::unique_ptr<magma::PlatformSemaphore> platform_semaphore_; |
| }; |
| |
| class MsdImgAbiSemaphore : public msd_semaphore_t |
| { |
| public: |
| MsdImgAbiSemaphore(std::shared_ptr<MsdImgSemaphore> ptr) : base_ptr_(std::move(ptr)) { magic_ = kMagic; } |
| |
| static MsdImgAbiSemaphore* cast(msd_semaphore_t* sema) |
| { |
| DASSERT(sema); |
| DASSERT(sema->magic_ == kMagic); |
| return static_cast<MsdImgAbiSemaphore*>(sema); |
| } |
| |
| std::shared_ptr<MsdImgSemaphore> base_ptr() { return base_ptr_; } |
| |
| private: |
| std::shared_ptr<MsdImgSemaphore> base_ptr_; |
| |
| static const uint32_t kMagic = 'sema'; |
| }; |
| |
| #endif // MSD_IMG_SEMAPHORE_H |