blob: 68e9d81f0aa0757852bb4e6744b1836af464ffbd [file] [log] [blame]
// Copyright 2016 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.
#include "anv_private.h"
#include "magma_util/macros.h"
#include "platform_futex.h"
#include "magma_system.h"
#include <errno.h>
int anv_platform_futex_wake(uint32_t* addr, int count)
{
if (!magma::PlatformFutex::Wake(addr, count))
return DRET_MSG(-1, "Wake failed");
return 0;
}
int anv_platform_futex_wait(uint32_t* addr, int32_t value)
{
magma::PlatformFutex::WaitResult result;
if (!magma::PlatformFutex::WaitForever(addr, value, &result))
return DRET_MSG(-EINVAL, "WaitForever failed");
if (result == magma::PlatformFutex::WaitResult::RETRY)
return -EAGAIN;
assert(result == magma::PlatformFutex::WaitResult::AWOKE);
return 0;
}
int anv_platform_create_semaphore(anv_device* device, anv_semaphore_t* semaphore_out)
{
magma_semaphore_t semaphore;
magma_status_t status = magma_system_create_semaphore(device->connection, &semaphore);
if (status != MAGMA_STATUS_OK)
return DRET_MSG(-EINVAL, "magma_system_create_semaphore failed: %d", status);
*semaphore_out = reinterpret_cast<anv_semaphore_t>(semaphore);
return 0;
}
void anv_platform_destroy_semaphore(anv_device* device, anv_semaphore_t semaphore)
{
magma_system_destroy_semaphore(device->connection,
reinterpret_cast<magma_semaphore_t>(semaphore));
}