summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/sync/sync_sdl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/sync/sync_sdl.cpp')
-rw-r--r--src/osd/modules/sync/sync_sdl.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/osd/modules/sync/sync_sdl.cpp b/src/osd/modules/sync/sync_sdl.cpp
index 73b735fefb3..90969b2a068 100644
--- a/src/osd/modules/sync/sync_sdl.cpp
+++ b/src/osd/modules/sync/sync_sdl.cpp
@@ -51,6 +51,138 @@ struct osd_thread {
void *param;
};
+struct osd_scalable_lock
+{
+ SDL_mutex * mutex;
+};
+
+//============================================================
+// Scalable Locks
+//============================================================
+
+osd_scalable_lock *osd_scalable_lock_alloc(void)
+{
+ osd_scalable_lock *lock;
+
+ lock = (osd_scalable_lock *)calloc(1, sizeof(*lock));
+ if (lock == NULL)
+ return NULL;
+
+ lock->mutex = SDL_CreateMutex();
+ return lock;
+}
+
+
+INT32 osd_scalable_lock_acquire(osd_scalable_lock *lock)
+{
+ SDL_mutexP(lock->mutex);
+ return 0;
+}
+
+
+void osd_scalable_lock_release(osd_scalable_lock *lock, INT32 myslot)
+{
+ SDL_mutexV(lock->mutex);
+}
+
+void osd_scalable_lock_free(osd_scalable_lock *lock)
+{
+ SDL_DestroyMutex(lock->mutex);
+ free(lock);
+}
+
+//============================================================
+// osd_lock_alloc
+//============================================================
+
+osd_lock *osd_lock_alloc(void)
+{
+ hidden_mutex_t *mutex;
+
+ mutex = (hidden_mutex_t *)calloc(1, sizeof(hidden_mutex_t));
+ if (mutex == NULL)
+ return NULL;
+
+ mutex->id = SDL_CreateMutex();
+
+ return (osd_lock *)mutex;
+}
+
+//============================================================
+// osd_lock_acquire
+//============================================================
+
+void osd_lock_acquire(osd_lock *lock)
+{
+ hidden_mutex_t *mutex = (hidden_mutex_t *) lock;
+
+ LOG(("osd_lock_acquire"));
+ /* get the lock */
+ mutex->locked++; /* signal that we are *about* to lock - prevent osd_lock_try */
+ SDL_mutexP(mutex->id);
+ mutex->threadid = SDL_ThreadID();
+}
+
+//============================================================
+// osd_lock_try
+//============================================================
+
+int osd_lock_try(osd_lock *lock)
+{
+ hidden_mutex_t *mutex = (hidden_mutex_t *) lock;
+
+ LOG(("osd_lock_try"));
+ if (mutex->locked && mutex->threadid == SDL_ThreadID())
+ {
+ /* get the lock */
+ SDL_mutexP(mutex->id);
+ mutex->locked++;
+ mutex->threadid = SDL_ThreadID();
+ return 1;
+ }
+ else if ((mutex->locked == 0))
+ {
+ /* get the lock */
+ mutex->locked++;
+ SDL_mutexP(mutex->id);
+ mutex->threadid = SDL_ThreadID();
+ return 1;
+ }
+ else
+ {
+ /* fail */
+ return 0;
+ }
+}
+
+//============================================================
+// osd_lock_release
+//============================================================
+
+void osd_lock_release(osd_lock *lock)
+{
+ hidden_mutex_t *mutex = (hidden_mutex_t *) lock;
+
+ LOG(("osd_lock_release"));
+ mutex->locked--;
+ if (mutex->locked == 0)
+ mutex->threadid = -1;
+ SDL_mutexV(mutex->id);
+}
+
+//============================================================
+// osd_lock_free
+//============================================================
+
+void osd_lock_free(osd_lock *lock)
+{
+ hidden_mutex_t *mutex = (hidden_mutex_t *) lock;
+
+ LOG(("osd_lock_free"));
+ //osd_lock_release(lock);
+ SDL_DestroyMutex(mutex->id);
+ free(mutex);
+}
//============================================================
// osd_event_alloc
@@ -191,7 +323,11 @@ osd_thread *osd_thread_create(osd_thread_callback callback, void *cbparam)
return NULL;
thread->callback = callback;
thread->param = cbparam;
+#ifdef SDLMAME_SDL2
thread->thread = SDL_CreateThread(worker_thread_entry, "Thread", thread);
+#else
+ thread->thread = SDL_CreateThread(worker_thread_entry, thread);
+#endif
if ( thread->thread == NULL )
{
free(thread);