blob: f3cdf8fe06212202cfcbf87ee2459df1cef9e69c [file] [log] [blame]
// Copyright 2017 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 SRC_GRAPHICS_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_ZIRCON_ZIRCON_PLATFORM_SEMAPHORE_H_
#define SRC_GRAPHICS_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_ZIRCON_ZIRCON_PLATFORM_SEMAPHORE_H_
#include <lib/zx/event.h>
#include "magma_util/macros.h"
#include "platform_semaphore.h"
#include "platform_trace.h"
namespace magma {
class ZirconPlatformSemaphore : public PlatformSemaphore {
public:
ZirconPlatformSemaphore(zx::event event, uint64_t koid) : event_(std::move(event)), koid_(koid) {}
uint64_t id() override { return koid_; }
bool duplicate_handle(uint32_t* handle_out) override;
void Reset() override {
event_.signal(zx_signal(), 0);
TRACE_DURATION("magma:sync", "semaphore reset", "id", koid_);
TRACE_FLOW_END("magma:sync", "semaphore signal", koid_);
TRACE_FLOW_END("magma:sync", "semaphore wait async", koid_);
}
void Signal() override {
TRACE_FLOW_BEGIN("gfx", "event_signal", koid_);
TRACE_DURATION("magma:sync", "semaphore signal", "id", koid_);
TRACE_FLOW_BEGIN("magma:sync", "semaphore signal", koid_);
zx_status_t status = event_.signal(0u, zx_signal());
DASSERT(status == ZX_OK);
}
magma::Status WaitNoReset(uint64_t timeout_ms) override;
magma::Status Wait(uint64_t timeout_ms) override;
bool WaitAsync(PlatformPort* port, uint64_t* key_out) override;
zx_handle_t zx_handle() const { return event_.get(); }
zx_signals_t zx_signal() const { return ZX_EVENT_SIGNALED; }
private:
zx::event event_;
uint64_t koid_;
};
} // namespace magma
#endif // SRC_GRAPHICS_LIB_MAGMA_SRC_MAGMA_UTIL_PLATFORM_ZIRCON_ZIRCON_PLATFORM_SEMAPHORE_H_