X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fthreads_glue.c;fp=AcessNative%2Facesskernel_src%2Fthreads_glue.c;h=fa83980e38890f8f707b83f73b87c1ba30384a67;hb=c3cbbd71507f45fae706cb1396327a9f7abc02f9;hp=c2efb713e3448869059fb83496c2de4241d77d65;hpb=02f33541cab4bb1010c3388de7aaa49751e553a3;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/threads_glue.c b/AcessNative/acesskernel_src/threads_glue.c index c2efb713..fa83980e 100644 --- a/AcessNative/acesskernel_src/threads_glue.c +++ b/AcessNative/acesskernel_src/threads_glue.c @@ -21,6 +21,7 @@ typedef void **tShortSpinlock; #define NORETURN __attribute__((noreturn)) #include // Kernel land, but uses standards +#include // === CODE === void Threads_Glue_Yield(void) @@ -82,9 +83,15 @@ void Threads_int_ShortLock(void **MutexPtr) { if( !*MutexPtr ) { *MutexPtr = malloc( sizeof(pthread_mutex_t) ); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); pthread_mutex_init(*MutexPtr, NULL); } - pthread_mutex_lock(*MutexPtr); + if( pthread_mutex_lock(*MutexPtr) ) { + fprintf(stderr, "ERROR: Mutex pointer %p double locked\n", MutexPtr); + AcessNative_Exit(); + } } void Threads_int_ShortRel(void **MutexPtr) @@ -92,4 +99,18 @@ void Threads_int_ShortRel(void **MutexPtr) pthread_mutex_unlock(*MutexPtr); } +int Threads_int_ShortHas(void **Ptr) +{ + if( !*Ptr ) + return 0; + int rv = pthread_mutex_trylock(*Ptr); + if( rv == 0 ) { + pthread_mutex_unlock(*Ptr); + return 0; + } + if( rv == EBUSY ) { + return 0; + } + return 1; +}