|  | /*
 * JackBridge (Part 2, Semaphore functions)
 * Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com>
 *
 * Permission to use, copy, modify, and/or distribute this software for any purpose with
 * or without fee is hereby granted, provided that the above copyright notice and this
 * permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#include "JackBridge.hpp"
#ifdef JACKBRIDGE_DUMMY
# include "CarlaUtils.hpp"
#else
# include <cerrno>
# include "CarlaSemUtils.hpp"
# include "CarlaShmUtils.hpp"
#endif // ! JACKBRIDGE_DUMMY
// -----------------------------------------------------------------------------
bool jackbridge_sem_init(void* sem) noexcept
{
#if defined(JACKBRIDGE_DUMMY)
    return false;
#else
    sem_t* const sema(carla_sem_create());
    CARLA_SAFE_ASSERT_RETURN(sema != nullptr, false);
    std::memcpy(sem, sema, sizeof(sem_t));
    return (sema != nullptr);
#endif
}
void jackbridge_sem_destroy(void* sem) noexcept
{
#ifndef JACKBRIDGE_DUMMY
    carla_sem_destroy((sem_t*)sem);
#endif
}
bool jackbridge_sem_post(void* sem) noexcept
{
#ifdef JACKBRIDGE_DUMMY
    return false;
#else
    return carla_sem_post((sem_t*)sem);
#endif
}
bool jackbridge_sem_timedwait(void* sem, uint secs, bool* timedOut) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(timedOut != nullptr, false);
#ifdef JACKBRIDGE_DUMMY
    return false;
#else
    if (carla_sem_timedwait((sem_t*)sem, secs))
    {
        *timedOut = false;
        return true;
    }
    *timedOut = (errno == ETIMEDOUT);
    return false;
#endif
}
// -----------------------------------------------------------------------------
bool jackbridge_shm_is_valid(const void* shm) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(shm != nullptr, false);
#ifdef JACKBRIDGE_DUMMY
    return false;
#else
    return carla_is_shm_valid(*(const shm_t*)shm);
#endif
}
void jackbridge_shm_init(void* shm) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
#ifndef JACKBRIDGE_DUMMY
    carla_shm_init(*(shm_t*)shm);
#endif
}
void jackbridge_shm_attach(void* shm, const char* name) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
#ifndef JACKBRIDGE_DUMMY
    *(shm_t*)shm = carla_shm_attach(name);
#endif
}
void jackbridge_shm_close(void* shm) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
#ifndef JACKBRIDGE_DUMMY
    carla_shm_close(*(shm_t*)shm);
#endif
}
void* jackbridge_shm_map(void* shm, size_t size) noexcept
{
    CARLA_SAFE_ASSERT_RETURN(shm != nullptr, nullptr);
#ifdef JACKBRIDGE_DUMMY
    return nullptr;
#else
    return carla_shm_map(*(shm_t*)shm, size);
#endif
}
// -----------------------------------------------------------------------------
 |