diff options
Diffstat (limited to 'src/osd/modules/sync/sync_tc.cpp')
-rw-r--r-- | src/osd/modules/sync/sync_tc.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/osd/modules/sync/sync_tc.cpp b/src/osd/modules/sync/sync_tc.cpp index 64a6a760e96..06dc699edce 100644 --- a/src/osd/modules/sync/sync_tc.cpp +++ b/src/osd/modules/sync/sync_tc.cpp @@ -58,6 +58,123 @@ struct osd_thread { pthread_t thread; }; +struct osd_scalable_lock +{ + osd_lock *lock; +}; + +//============================================================ +// 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->lock = osd_lock_alloc(); + return lock; +} + + +INT32 osd_scalable_lock_acquire(osd_scalable_lock *lock) +{ + osd_lock_acquire(lock->lock); + return 0; +} + + +void osd_scalable_lock_release(osd_scalable_lock *lock, INT32 myslot) +{ + osd_lock_release(lock->lock); +} + +void osd_scalable_lock_free(osd_scalable_lock *lock) +{ + osd_lock_free(lock->lock); + free(lock); +} + + +//============================================================ +// osd_lock_alloc +//============================================================ + +osd_lock *osd_lock_alloc(void) +{ + hidden_mutex_t *mutex; + pthread_mutexattr_t mtxattr; + + mutex = (hidden_mutex_t *)calloc(1, sizeof(hidden_mutex_t)); + if (mutex == NULL) + return NULL; + + pthread_mutexattr_init(&mtxattr); + pthread_mutexattr_settype(&mtxattr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex->id, &mtxattr); + + return (osd_lock *)mutex; +} + +//============================================================ +// osd_lock_acquire +//============================================================ + +void osd_lock_acquire(osd_lock *lock) +{ + hidden_mutex_t *mutex = (hidden_mutex_t *) lock; + int r; + + r = pthread_mutex_lock(&mutex->id); + if (r==0) + return; + //osd_printf_error("Error on lock: %d: %s\n", r, strerror(r)); +} + +//============================================================ +// osd_lock_try +//============================================================ + +int osd_lock_try(osd_lock *lock) +{ + hidden_mutex_t *mutex = (hidden_mutex_t *) lock; + int r; + + r = pthread_mutex_trylock(&mutex->id); + if (r==0) + return 1; + //if (r!=EBUSY) + // osd_printf_error("Error on trylock: %d: %s\n", r, strerror(r)); + return 0; +} + +//============================================================ +// osd_lock_release +//============================================================ + +void osd_lock_release(osd_lock *lock) +{ + hidden_mutex_t *mutex = (hidden_mutex_t *) lock; + + pthread_mutex_unlock(&mutex->id); +} + +//============================================================ +// osd_lock_free +//============================================================ + +void osd_lock_free(osd_lock *lock) +{ + hidden_mutex_t *mutex = (hidden_mutex_t *) lock; + + //pthread_mutex_unlock(&mutex->id); + pthread_mutex_destroy(&mutex->id); + free(mutex); +} + //============================================================ // osd_event_alloc //============================================================ |