#include "SDL_internal.h"
#ifdef SDL_THREAD_PS2
#include <stdio.h>
#include <stdlib.h>
#include <kernel_util.h>
#include <kernel.h>
struct SDL_Semaphore
{
s32 semid;
};
SDL_Semaphore *SDL_CreateSemaphore(Uint32 initial_value)
{
SDL_Semaphore *sem;
ee_sema_t sema;
sem = (SDL_Semaphore *)SDL_malloc(sizeof(*sem));
if (sem) {
sema.init_count = initial_value;
sema.max_count = 255;
sema.option = 0;
sem->semid = CreateSema(&sema);
if (sem->semid < 0) {
SDL_SetError("Couldn't create semaphore");
SDL_free(sem);
sem = NULL;
}
}
return sem;
}
void SDL_DestroySemaphore(SDL_Semaphore *sem)
{
if (sem) {
if (sem->semid > 0) {
DeleteSema(sem->semid);
sem->semid = 0;
}
SDL_free(sem);
}
}
bool SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS)
{
u64 timeout_usec;
u64 *timeout_ptr;
if (!sem) {
return true;
}
if (timeoutNS == 0) {
return (PollSema(sem->semid) == 0);
}
timeout_ptr = NULL;
if (timeoutNS != -1) { timeout_usec = SDL_NS_TO_US(timeoutNS);
timeout_ptr = &timeout_usec;
}
return (WaitSemaEx(sem->semid, 1, timeout_ptr) == 0);
}
Uint32 SDL_GetSemaphoreValue(SDL_Semaphore *sem)
{
ee_sema_t info;
if (!sem) {
return 0;
}
if (ReferSemaStatus(sem->semid, &info) == 0) {
return info.count;
}
return 0;
}
void SDL_SignalSemaphore(SDL_Semaphore *sem)
{
if (!sem) {
return;
}
SignalSema(sem->semid);
}
#endif