Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
156 lines (126 loc) · 3.76 KB

SDL_syssem.c

File metadata and controls

156 lines (126 loc) · 3.76 KB
 
Mar 17, 2013
Mar 17, 2013
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
Simple DirectMedia Layer
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
/* Semaphore functions for the PSP. */
#include <stdio.h>
#include <stdlib.h>
#include "SDL_error.h"
#include "SDL_thread.h"
#include <pspthreadman.h>
#include <pspkerror.h>
struct SDL_semaphore {
May 18, 2013
May 18, 2013
34
SceUID semid;
Mar 17, 2013
Mar 17, 2013
35
36
37
38
39
40
};
/* Create a semaphore */
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
{
May 18, 2013
May 18, 2013
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
SDL_sem *sem;
sem = (SDL_sem *) malloc(sizeof(*sem));
if (sem != NULL) {
/* TODO: Figure out the limit on the maximum value. */
sem->semid = sceKernelCreateSema("SDL sema", 0, initial_value, 255, NULL);
if (sem->semid < 0) {
SDL_SetError("Couldn't create semaphore");
free(sem);
sem = NULL;
}
} else {
SDL_OutOfMemory();
}
return sem;
Mar 17, 2013
Mar 17, 2013
57
58
59
60
61
}
/* Free the semaphore */
void SDL_DestroySemaphore(SDL_sem *sem)
{
May 18, 2013
May 18, 2013
62
63
64
65
66
67
68
69
if (sem != NULL) {
if (sem->semid > 0) {
sceKernelDeleteSema(sem->semid);
sem->semid = 0;
}
free(sem);
}
Mar 17, 2013
Mar 17, 2013
70
71
72
73
74
75
76
77
}
/* TODO: This routine is a bit overloaded.
* If the timeout is 0 then just poll the semaphore; if it's SDL_MUTEX_MAXWAIT, pass
* NULL to sceKernelWaitSema() so that it waits indefinitely; and if the timeout
* is specified, convert it to microseconds. */
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
{
May 18, 2013
May 18, 2013
78
Uint32 *pTimeout;
Mar 17, 2013
Mar 17, 2013
79
80
unsigned int res;
May 18, 2013
May 18, 2013
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
if (sem == NULL) {
SDL_SetError("Passed a NULL sem");
return 0;
}
if (timeout == 0) {
res = sceKernelPollSema(sem->semid, 1);
if (res < 0) {
return SDL_MUTEX_TIMEDOUT;
}
return 0;
}
if (timeout == SDL_MUTEX_MAXWAIT) {
pTimeout = NULL;
} else {
timeout *= 1000; /* Convert to microseconds. */
pTimeout = &timeout;
}
res = sceKernelWaitSema(sem->semid, 1, pTimeout);
Mar 17, 2013
Mar 17, 2013
102
103
104
105
106
107
switch (res) {
case SCE_KERNEL_ERROR_OK:
return 0;
case SCE_KERNEL_ERROR_WAIT_TIMEOUT:
return SDL_MUTEX_TIMEDOUT;
default:
Mar 31, 2013
Mar 31, 2013
108
return SDL_SetError("WaitForSingleObject() failed");
May 18, 2013
May 18, 2013
109
}
Mar 17, 2013
Mar 17, 2013
110
111
112
113
}
int SDL_SemTryWait(SDL_sem *sem)
{
May 18, 2013
May 18, 2013
114
return SDL_SemWaitTimeout(sem, 0);
Mar 17, 2013
Mar 17, 2013
115
116
117
118
}
int SDL_SemWait(SDL_sem *sem)
{
May 18, 2013
May 18, 2013
119
return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
Mar 17, 2013
Mar 17, 2013
120
121
122
123
124
}
/* Returns the current count of the semaphore */
Uint32 SDL_SemValue(SDL_sem *sem)
{
May 18, 2013
May 18, 2013
125
SceKernelSemaInfo info;
Mar 17, 2013
Mar 17, 2013
126
May 18, 2013
May 18, 2013
127
128
129
130
if (sem == NULL) {
SDL_SetError("Passed a NULL sem");
return 0;
}
Mar 17, 2013
Mar 17, 2013
131
May 18, 2013
May 18, 2013
132
133
134
if (sceKernelReferSemaStatus(sem->semid, &info) >= 0) {
return info.currentCount;
}
Mar 17, 2013
Mar 17, 2013
135
May 18, 2013
May 18, 2013
136
return 0;
Mar 17, 2013
Mar 17, 2013
137
138
139
140
}
int SDL_SemPost(SDL_sem *sem)
{
May 18, 2013
May 18, 2013
141
int res;
Mar 17, 2013
Mar 17, 2013
142
May 18, 2013
May 18, 2013
143
144
145
if (sem == NULL) {
return SDL_SetError("Passed a NULL sem");
}
Mar 17, 2013
Mar 17, 2013
146
May 18, 2013
May 18, 2013
147
148
149
150
res = sceKernelSignalSema(sem->semid, 1);
if (res < 0) {
return SDL_SetError("sceKernelSignalSema() failed");
}
Mar 17, 2013
Mar 17, 2013
151
May 18, 2013
May 18, 2013
152
return 0;
Mar 17, 2013
Mar 17, 2013
153
154
155
156
}
/* vim: ts=4 sw=4
*/