diff --git a/libpthread/Makefile b/libpthread/Makefile index 89aee0a0..4805d5de 100644 --- a/libpthread/Makefile +++ b/libpthread/Makefile @@ -14,6 +14,7 @@ OBJS=\ pthread_equal.o \ pthread_initialize.o \ pthread_mutex_lock.o \ +pthread_mutex_trylock.o \ pthread_mutex_unlock.o \ pthread_self.o \ diff --git a/libpthread/include/pthread.h b/libpthread/include/pthread.h index 8475fbde..fec3d7ef 100644 --- a/libpthread/include/pthread.h +++ b/libpthread/include/pthread.h @@ -210,7 +210,7 @@ int pthread_equal(pthread_t, pthread_t); int pthread_mutex_lock(pthread_mutex_t*); /* TODO: pthread_mutex_setprioceiling */ /* TODO: pthread_mutex_timedlock */ -/* TODO: pthread_mutex_trylock */ +int pthread_mutex_trylock(pthread_mutex_t*); int pthread_mutex_unlock(pthread_mutex_t*); /* TODO: pthread_mutexattr_destroy */ /* TODO: pthread_mutexattr_getprioceiling */ diff --git a/libpthread/pthread_mutex_trylock.c++ b/libpthread/pthread_mutex_trylock.c++ new file mode 100644 index 00000000..062de9ce --- /dev/null +++ b/libpthread/pthread_mutex_trylock.c++ @@ -0,0 +1,43 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. + + This file is part of Sortix libpthread. + + Sortix libpthread is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + Sortix libpthread is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Sortix libpthread. If not, see . + + pthread_mutex_trylock.c++ + Attempts to lock a mutex. + +*******************************************************************************/ + +#include +#include + +static const unsigned long UNLOCKED_VALUE = 0; +static const unsigned long LOCKED_VALUE = 1; + +extern "C" int pthread_mutex_trylock(pthread_mutex_t* mutex) +{ + if ( !__sync_bool_compare_and_swap(&mutex->lock, UNLOCKED_VALUE, LOCKED_VALUE) ) + { + if ( mutex->type == PTHREAD_MUTEX_RECURSIVE && + (pthread_t) mutex->owner == pthread_self() ) + return mutex->recursion++, 0; + return errno = EBUSY; + } + mutex->owner = (unsigned long) pthread_self(); + mutex->recursion = 0; + return 0; +}