#include "SDL_internal.h"
#ifdef SDL_THREAD_PSP
#include <stdio.h>
#include <stdlib.h>
#include <pspthreadman.h>
#include <pspkerror.h>
struct SDL_Semaphore
{
SceUID semid;
};
SDL_Semaphore *SDL_CreateSemaphore(Uint32 initial_value)
{
SDL_Semaphore *sem;
sem = (SDL_Semaphore *)SDL_malloc(sizeof(*sem));
if (sem) {
sem->semid = sceKernelCreateSema("SDL sema", 0, initial_value, 255, NULL);
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) {
sceKernelDeleteSema(sem->semid);
sem->semid = 0;
}
SDL_free(sem);
}
}
bool SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS)
{
SceUInt timeoutUS;
SceUInt *pTimeout = NULL;
if (!sem) {
return true;
}
if (timeoutNS == 0) {
return (sceKernelPollSema(sem->semid, 1) == 0);
}
if (timeoutNS > 0) {
timeoutUS = (SceUInt)SDL_NS_TO_US(timeoutNS); pTimeout = &timeoutUS;
}
return (sceKernelWaitSema(sem->semid, 1, pTimeout) == 0);
}
Uint32 SDL_GetSemaphoreValue(SDL_Semaphore *sem)
{
SceKernelSemaInfo info;
if (!sem) {
return 0;
}
if (sceKernelReferSemaStatus(sem->semid, &info) == 0) {
return info.currentCount;
}
return 0;
}
void SDL_SignalSemaphore(SDL_Semaphore *sem)
{
if (!sem) {
return;
}
sceKernelSignalSema(sem->semid, 1);
}
#endif