diff options
Diffstat (limited to 'src/osd/modules/sync/sync_sdl.cpp')
-rw-r--r-- | src/osd/modules/sync/sync_sdl.cpp | 136 |
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); |