summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/sync/sync_tc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/sync/sync_tc.cpp')
-rw-r--r--src/osd/modules/sync/sync_tc.cpp117
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
//============================================================