aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/platform/psp/osys_psp.cpp8
-rw-r--r--backends/platform/psp/thread.cpp84
-rw-r--r--backends/platform/psp/thread.h27
3 files changed, 115 insertions, 4 deletions
diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp
index 48e9044535..b0fb971230 100644
--- a/backends/platform/psp/osys_psp.cpp
+++ b/backends/platform/psp/osys_psp.cpp
@@ -346,19 +346,19 @@ void OSystem_PSP::setTimerCallback(TimerProc callback, int interval) {
}
OSystem::MutexRef OSystem_PSP::createMutex(void) {
- return (MutexRef)SDL_CreateMutex();
+ return (MutexRef) new PspMutex(true); // start with a full mutex
}
void OSystem_PSP::lockMutex(MutexRef mutex) {
- SDL_mutexP((SDL_mutex *)mutex);
+ ((PspMutex *)mutex)->lock();
}
void OSystem_PSP::unlockMutex(MutexRef mutex) {
- SDL_mutexV((SDL_mutex *)mutex);
+ ((PspMutex *)mutex)->unlock();
}
void OSystem_PSP::deleteMutex(MutexRef mutex) {
- SDL_DestroyMutex((SDL_mutex *)mutex);
+ delete (PspMutex *)mutex;
}
void OSystem_PSP::mixCallback(void *sys, byte *samples, int len) {
diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp
index 4e7d5eada9..684a985fed 100644
--- a/backends/platform/psp/thread.cpp
+++ b/backends/platform/psp/thread.cpp
@@ -31,6 +31,8 @@
#include "backends/platform/psp/thread.h"
#include "backends/platform/psp/trace.h"
+// Class PspThread --------------------------------------------------
+
void PspThread::delayMillis(uint32 ms) {
sceKernelDelayThread(ms * 1000);
}
@@ -39,6 +41,88 @@ void PspThread::delayMicros(uint32 us) {
sceKernelDelayThread(us);
}
+// Class PspSemaphore ------------------------------------------------
+//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */
+//#define __PSP_DEBUG_PRINT__ /* For debug printouts */
+
+#include "backends/platform/psp/trace.h"
+
+PspSemaphore::PspSemaphore(int initialValue, int maxValue) {
+ DEBUG_ENTER_FUNC();
+ _handle = 0;
+ _handle = sceKernelCreateSema("ScummVM Sema", 0 /* attr */,
+ initialValue, maxValue,
+ 0 /*option*/);
+ if (!_handle)
+ PSP_ERROR("failed to create semaphore.\n");
+}
+
+PspSemaphore::~PspSemaphore() {
+ DEBUG_ENTER_FUNC();
+ if (_handle)
+ if (sceKernelDeleteSema(_handle) < 0)
+ PSP_ERROR("failed to delete semaphore.\n");
+}
+
+int PspSemaphore::numOfWaitingThreads() {
+ DEBUG_ENTER_FUNC();
+ SceKernelSemaInfo info;
+ info.numWaitThreads = 0;
+
+ if (sceKernelReferSemaStatus(_handle, &info) < 0)
+ PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle);
+
+ return info.numWaitThreads;
+}
+
+int PspSemaphore::getValue() {
+ DEBUG_ENTER_FUNC();
+ SceKernelSemaInfo info;
+ info.currentCount = 0;
+
+ if (sceKernelReferSemaStatus(_handle, &info) < 0)
+ PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle);
+
+ return info.currentCount;
+}
+
+bool PspSemaphore::pollForValue(int value) {
+ DEBUG_ENTER_FUNC();
+ if (sceKernelPollSema(_handle, value) < 0)
+ return false;
+
+ return true;
+}
+
+// false: timeout or error
+bool PspSemaphore::takeWithTimeOut(int num, uint32 timeOut) {
+ DEBUG_ENTER_FUNC();
+
+ uint32 *pTimeOut = 0;
+ if (timeOut)
+ pTimeOut = &timeOut;
+
+ if (sceKernelWaitSema(_handle, num, pTimeOut) < 0)
+ return false;
+ return true;
+}
+
+bool PspSemaphore::give(int num) {
+ DEBUG_ENTER_FUNC();
+
+ if (sceKernelSignalSema(_handle, num) < 0)
+ return false;
+ return true;
+}
+
+//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */
+//#define __PSP_DEBUG_PRINT__ /* For debug printouts */
+
+#include "backends/platform/psp/trace.h"
+
+
+// Class PspRtc ---------------------------------------------------------------
+
void PspRtc::init() { // init our starting ticks
uint32 ticks[2];
sceRtcGetCurrentTick((u64 *)ticks);
diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h
index 380159fa2d..23db8594dc 100644
--- a/backends/platform/psp/thread.h
+++ b/backends/platform/psp/thread.h
@@ -34,6 +34,33 @@ public:
static void delayMicros(uint32 us);
};
+class PspSemaphore {
+private:
+ SceUID _handle;
+public:
+ PspSemaphore(int initialValue, int maxValue);
+ ~PspSemaphore();
+ bool take(int num) { return takeWithTimeOut(num, 0); }
+ bool takeWithTimeOut(int num, uint32 timeOut);
+ bool give(int num);
+ bool pollForValue(int value); // check for a certain value
+ int numOfWaitingThreads();
+ int getValue();
+};
+
+class PspMutex {
+private:
+ PspSemaphore _semaphore;
+public:
+ PspMutex(bool initialValue) : _semaphore(initialValue ? 1 : 0, 255) {} // initial, max value
+ bool lock() { return _semaphore.take(1); }
+ bool unlock() { return _semaphore.give(1); }
+ bool poll() { return _semaphore.pollForValue(1); }
+ int getNumWaitingThreads() { return _semaphore.numOfWaitingThreads(); }
+ bool getValue() { return (bool)_semaphore.getValue(); }
+};
+
+
class PspRtc {
private:
uint32 _startMillis;