diff --git a/libpthread/Makefile b/libpthread/Makefile index b5f4b09c..9bd17934 100644 --- a/libpthread/Makefile +++ b/libpthread/Makefile @@ -33,6 +33,8 @@ pthread_mutex_lock.o \ pthread_mutex_trylock.o \ pthread_mutex_unlock.o \ pthread_rwlock_rdlock.o \ +pthread_rwlock_tryrdlock.o \ +pthread_rwlock_trywrlock.o \ pthread_rwlock_unlock.o \ pthread_rwlock_wrlock.o \ pthread_self.o \ diff --git a/libpthread/include/pthread.h b/libpthread/include/pthread.h index 2da9e4cd..d380430b 100644 --- a/libpthread/include/pthread.h +++ b/libpthread/include/pthread.h @@ -245,8 +245,8 @@ int pthread_mutexattr_settype(pthread_mutexattr_t*, int); int pthread_rwlock_rdlock(pthread_rwlock_t*); /* TODO: pthread_rwlock_timedrdlock */ /* TODO: pthread_rwlock_timedwrlock */ -/* TODO: pthread_rwlock_tryrdlock */ -/* TODO: pthread_rwlock_trywrlock */ +int pthread_rwlock_tryrdlock(pthread_rwlock_t*); +int pthread_rwlock_trywrlock(pthread_rwlock_t*); int pthread_rwlock_unlock(pthread_rwlock_t*); int pthread_rwlock_wrlock(pthread_rwlock_t*); /* TODO: pthread_rwlockattr_destroy */ diff --git a/libpthread/pthread_rwlock_tryrdlock.c++ b/libpthread/pthread_rwlock_tryrdlock.c++ new file mode 100644 index 00000000..6074a83a --- /dev/null +++ b/libpthread/pthread_rwlock_tryrdlock.c++ @@ -0,0 +1,40 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + 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_rwlock_tryrdlock.c++ + Attempts to acquire read access to a read-write lock. + +*******************************************************************************/ + +#include +#include + +extern "C" int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock) +{ + if ( int ret = pthread_mutex_trylock(&rwlock->request_mutex) ) + return errno = ret; + while ( rwlock->num_writers || rwlock->pending_writers ) + { + pthread_mutex_unlock(&rwlock->request_mutex); + return errno = EBUSY; + } + rwlock->num_readers++; + pthread_mutex_unlock(&rwlock->request_mutex); + return 0; +} diff --git a/libpthread/pthread_rwlock_trywrlock.c++ b/libpthread/pthread_rwlock_trywrlock.c++ new file mode 100644 index 00000000..8d06b9c4 --- /dev/null +++ b/libpthread/pthread_rwlock_trywrlock.c++ @@ -0,0 +1,40 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + 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_rwlock_trywrlock.c++ + Attempts to acquire write access to a read-write lock. + +*******************************************************************************/ + +#include +#include + +extern "C" int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock) +{ + if ( int ret = pthread_mutex_trylock(&rwlock->request_mutex) ) + return errno = ret; + if ( rwlock->num_readers || rwlock->num_writers ) + { + pthread_mutex_unlock(&rwlock->request_mutex); + return errno = EBUSY; + } + rwlock->num_writers = 1; + pthread_mutex_unlock(&rwlock->request_mutex); + return 0; +}