|
@@ -21,144 +21,144 @@
|
|
|
*/
|
|
|
#include <hl.h>
|
|
|
|
|
|
-#if !defined(HL_THREADS)
|
|
|
-
|
|
|
-struct _hl_lock {
|
|
|
- void *_unused;
|
|
|
-};
|
|
|
-
|
|
|
-struct _hl_tls {
|
|
|
- void *value;
|
|
|
+#if !defined(HL_THREADS)
|
|
|
+
|
|
|
+struct _hl_mutex {
|
|
|
+ void *_unused;
|
|
|
+};
|
|
|
+
|
|
|
+struct _hl_tls {
|
|
|
+ void *value;
|
|
|
};
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
#elif defined(HL_WIN)
|
|
|
-
|
|
|
-struct _hl_lock {
|
|
|
- CRITICAL_SECTION cs;
|
|
|
+
|
|
|
+struct _hl_mutex {
|
|
|
+ CRITICAL_SECTION cs;
|
|
|
};
|
|
|
|
|
|
#else
|
|
|
|
|
|
# include <pthread.h>
|
|
|
# include <unistd.h>
|
|
|
-# include <sys/syscall.h>
|
|
|
-
|
|
|
-struct _hl_lock {
|
|
|
- pthread_mutex_t lock;
|
|
|
-};
|
|
|
+# include <sys/syscall.h>
|
|
|
|
|
|
-struct _hl_tls {
|
|
|
- pthread_key_t key;
|
|
|
+struct _hl_mutex {
|
|
|
+ pthread_mutex_t lock;
|
|
|
+};
|
|
|
+
|
|
|
+struct _hl_tls {
|
|
|
+ pthread_key_t key;
|
|
|
};
|
|
|
#endif
|
|
|
|
|
|
// ----------------- ALLOC
|
|
|
|
|
|
-HL_PRIM hl_lock *hl_lock_alloc() {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
- return (hl_lock*)1;
|
|
|
-# elif defined(HL_WIN)
|
|
|
- hl_lock *l = (hl_lock*)malloc(sizeof(hl_lock));
|
|
|
- InitializeCriticalSection(&l->cs);
|
|
|
- return l;
|
|
|
-# else
|
|
|
- hl_lock *l = (hl_lock*)malloc(sizeof(hl_lock));
|
|
|
- pthread_mutexattr_t a;
|
|
|
- pthread_mutexattr_init(&a);
|
|
|
- pthread_mutexattr_settype(&a,PTHREAD_MUTEX_RECURSIVE);
|
|
|
- pthread_mutex_init(&l->lock,&a);
|
|
|
- pthread_mutexattr_destroy(&a);
|
|
|
- return l;
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void hl_lock_acquire( hl_lock *l ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
-# elif defined(HL_WIN)
|
|
|
- EnterCriticalSection(&l->cs);
|
|
|
-# else
|
|
|
- pthread_mutex_lock(&l->lock);
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM bool hl_lock_try_acquire( hl_lock *l ) {
|
|
|
-#if !defined(HL_THREADS)
|
|
|
- return true;
|
|
|
-# elif defined(HL_WIN)
|
|
|
- return (bool)TryEnterCriticalSection(&l->cs);
|
|
|
-# else
|
|
|
- return pthread_mutex_trylock(&l->lock) == 0;
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void hl_lock_release( hl_lock *l ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
-# elif defined(HL_WIN)
|
|
|
- LeaveCriticalSection(&l->cs);
|
|
|
-# else
|
|
|
- pthread_mutex_unlock(&l->lock);
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void hl_lock_free( hl_lock *l ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
-# elif defined(HL_WIN)
|
|
|
- DeleteCriticalSection(&l->cs);
|
|
|
- free(l);
|
|
|
-# else
|
|
|
- pthread_mutex_destroy(&l->lock);
|
|
|
- free(l);
|
|
|
-# endif
|
|
|
-}
|
|
|
+HL_PRIM hl_mutex *hl_mutex_alloc() {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+ return (hl_mutex*)1;
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ hl_mutex *l = (hl_mutex*)malloc(sizeof(hl_mutex));
|
|
|
+ InitializeCriticalSection(&l->cs);
|
|
|
+ return l;
|
|
|
+# else
|
|
|
+ hl_mutex *l = (hl_mutex*)malloc(sizeof(hl_mutex));
|
|
|
+ pthread_mutexattr_t a;
|
|
|
+ pthread_mutexattr_init(&a);
|
|
|
+ pthread_mutexattr_settype(&a,PTHREAD_MUTEX_RECURSIVE);
|
|
|
+ pthread_mutex_init(&l->lock,&a);
|
|
|
+ pthread_mutexattr_destroy(&a);
|
|
|
+ return l;
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void hl_mutex_acquire( hl_mutex *l ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ EnterCriticalSection(&l->cs);
|
|
|
+# else
|
|
|
+ pthread_mutex_lock(&l->lock);
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM bool hl_mutex_try_acquire( hl_mutex *l ) {
|
|
|
+#if !defined(HL_THREADS)
|
|
|
+ return true;
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ return (bool)TryEnterCriticalSection(&l->cs);
|
|
|
+# else
|
|
|
+ return pthread_mutex_trylock(&l->lock) == 0;
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void hl_mutex_release( hl_mutex *l ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ LeaveCriticalSection(&l->cs);
|
|
|
+# else
|
|
|
+ pthread_mutex_unlock(&l->lock);
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void hl_mutex_free( hl_mutex *l ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ DeleteCriticalSection(&l->cs);
|
|
|
+ free(l);
|
|
|
+# else
|
|
|
+ pthread_mutex_destroy(&l->lock);
|
|
|
+ free(l);
|
|
|
+# endif
|
|
|
+}
|
|
|
|
|
|
// ----------------- THREAD LOCAL
|
|
|
|
|
|
-HL_PRIM hl_tls *hl_tls_alloc() {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
- hl_tls *l = malloc(sizeof(hl_tls));
|
|
|
- l->value = NULL;
|
|
|
- return l;
|
|
|
-# elif defined(HL_WIN)
|
|
|
- DWORD t = TlsAlloc();
|
|
|
- TlsSetValue(t,NULL);
|
|
|
- return (hl_tls*)(int_val)t;
|
|
|
-# else
|
|
|
- hl_tls *l = malloc(sizeof(hl_tls));
|
|
|
- pthread_key_create(&l->key,NULL);
|
|
|
- return l;
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void hl_tls_free( hl_tls *l ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
- free(l);
|
|
|
-# elif defined(HL_WIN)
|
|
|
- TlsFree((DWORD)(int_val)l);
|
|
|
-# else
|
|
|
- pthread_key_delete(l->key);
|
|
|
- free(l);
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void hl_tls_set( hl_tls *l, void *v ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
- l->value = v;
|
|
|
-# elif defined(HL_WIN)
|
|
|
- TlsSetValue((DWORD)(int_val)l,v);
|
|
|
-# else
|
|
|
- pthread_setspecific(l->key,v);
|
|
|
-# endif
|
|
|
-}
|
|
|
-
|
|
|
-HL_PRIM void *hl_tls_get( hl_tls *l ) {
|
|
|
-# if !defined(HL_THREADS)
|
|
|
- return l->value;
|
|
|
-# elif defined(HL_WIN)
|
|
|
- return (void*)TlsGetValue((DWORD)(int_val)l);
|
|
|
-# else
|
|
|
- return pthread_getspecific(l->key);
|
|
|
-# endif
|
|
|
+HL_PRIM hl_tls *hl_tls_alloc() {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+ hl_tls *l = malloc(sizeof(hl_tls));
|
|
|
+ l->value = NULL;
|
|
|
+ return l;
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ DWORD t = TlsAlloc();
|
|
|
+ TlsSetValue(t,NULL);
|
|
|
+ return (hl_tls*)(int_val)t;
|
|
|
+# else
|
|
|
+ hl_tls *l = malloc(sizeof(hl_tls));
|
|
|
+ pthread_key_create(&l->key,NULL);
|
|
|
+ return l;
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void hl_tls_free( hl_tls *l ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+ free(l);
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ TlsFree((DWORD)(int_val)l);
|
|
|
+# else
|
|
|
+ pthread_key_delete(l->key);
|
|
|
+ free(l);
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void hl_tls_set( hl_tls *l, void *v ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+ l->value = v;
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ TlsSetValue((DWORD)(int_val)l,v);
|
|
|
+# else
|
|
|
+ pthread_setspecific(l->key,v);
|
|
|
+# endif
|
|
|
+}
|
|
|
+
|
|
|
+HL_PRIM void *hl_tls_get( hl_tls *l ) {
|
|
|
+# if !defined(HL_THREADS)
|
|
|
+ return l->value;
|
|
|
+# elif defined(HL_WIN)
|
|
|
+ return (void*)TlsGetValue((DWORD)(int_val)l);
|
|
|
+# else
|
|
|
+ return pthread_getspecific(l->key);
|
|
|
+# endif
|
|
|
}
|
|
|
|
|
|
// ----------------- THREAD
|
|
@@ -201,6 +201,7 @@ static void gc_thread_entry( thread_start *_s ) {
|
|
|
}
|
|
|
|
|
|
HL_PRIM hl_thread *hl_thread_start( void *callback, void *param, bool withGC ) {
|
|
|
+#ifdef HL_THREADS
|
|
|
if( withGC ) {
|
|
|
thread_start *s = (thread_start*)malloc(sizeof(thread_start));
|
|
|
s->callb = callback;
|
|
@@ -209,8 +210,8 @@ HL_PRIM hl_thread *hl_thread_start( void *callback, void *param, bool withGC ) {
|
|
|
callback = gc_thread_entry;
|
|
|
param = s;
|
|
|
}
|
|
|
+#endif
|
|
|
#if !defined(HL_THREADS)
|
|
|
- hl_pop_root();
|
|
|
hl_error("Threads support is disabled");
|
|
|
return NULL;
|
|
|
#elif defined(HL_WIN)
|