diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/Makefile | 4 | ||||
-rw-r--r-- | nptl/Versions | 1 | ||||
-rw-r--r-- | nptl/mtx_destroy.c | 26 | ||||
-rw-r--r-- | nptl/mtx_init.c | 53 | ||||
-rw-r--r-- | nptl/mtx_lock.c | 26 | ||||
-rw-r--r-- | nptl/mtx_timedlock.c | 28 | ||||
-rw-r--r-- | nptl/mtx_trylock.c | 26 | ||||
-rw-r--r-- | nptl/mtx_unlock.c | 26 | ||||
-rw-r--r-- | nptl/threads.h | 44 |
9 files changed, 233 insertions, 1 deletions
diff --git a/nptl/Makefile b/nptl/Makefile index 1fcf29f..4b889ab 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -141,7 +141,9 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \ pthread_mutex_setprioceiling \ pthread_setname pthread_getname \ pthread_setattr_default_np pthread_getattr_default_np \ - thrd_create thrd_detach thrd_exit thrd_join + thrd_create thrd_detach thrd_exit thrd_join \ + mtx_destroy mtx_init mtx_lock mtx_timedlock \ + mtx_trylock mtx_unlock # pthread_setuid pthread_seteuid pthread_setreuid \ # pthread_setresuid \ # pthread_setgid pthread_setegid pthread_setregid \ diff --git a/nptl/Versions b/nptl/Versions index 38d7e48..ca1be37 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -272,6 +272,7 @@ libpthread { # C11 thread symbols. GLIBC_2.28 { thrd_create; thrd_detach; thrd_exit; thrd_join; + mtx_init; mtx_lock; mtx_timedlock; mtx_trylock; mtx_unlock; mtx_destroy; } GLIBC_PRIVATE { diff --git a/nptl/mtx_destroy.c b/nptl/mtx_destroy.c new file mode 100644 index 0000000..15bc022 --- /dev/null +++ b/nptl/mtx_destroy.c @@ -0,0 +1,26 @@ +/* C11 threads mutex destroy implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "thrd_priv.h" +#include "pthreadP.h" + +void +mtx_destroy (mtx_t *mutex) +{ + __pthread_mutex_destroy ((pthread_mutex_t *) mutex); +} diff --git a/nptl/mtx_init.c b/nptl/mtx_init.c new file mode 100644 index 0000000..8f27478 --- /dev/null +++ b/nptl/mtx_init.c @@ -0,0 +1,53 @@ +/* C11 threads mutex initialization implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdalign.h> + +#include "thrd_priv.h" + +int +mtx_init (mtx_t *mutex, int type) +{ + _Static_assert (sizeof (mtx_t) == sizeof (pthread_mutex_t), + "sizeof (mtx_t) != sizeof (pthread_mutex_t)"); + _Static_assert (alignof (mtx_t) == alignof (pthread_mutex_t), + "alignof (mtx_t) != alignof (pthread_mutex_t)"); + + pthread_mutexattr_t attr; + + __pthread_mutexattr_init (&attr); + + /* Another possible solution would be to set the flags directly in + mutex object. */ + switch (type) + { + case mtx_plain | mtx_recursive: + case mtx_timed | mtx_recursive: + __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + break; + case mtx_plain: + case mtx_timed: /* No difference between both in standard */ + default: + __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_NORMAL); + break; + } + + int err_code = __pthread_mutex_init ((pthread_mutex_t *) mutex, &attr); + /* pthread_mutexattr_destroy implementation is a noop. */ + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_lock.c b/nptl/mtx_lock.c new file mode 100644 index 0000000..9b3e6cd --- /dev/null +++ b/nptl/mtx_lock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex lock implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "thrd_priv.h" + +int +mtx_lock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_lock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_timedlock.c b/nptl/mtx_timedlock.c new file mode 100644 index 0000000..0972622 --- /dev/null +++ b/nptl/mtx_timedlock.c @@ -0,0 +1,28 @@ +/* C11 threads mutex timed lock implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "thrd_priv.h" + +int +mtx_timedlock (mtx_t *restrict mutex, + const struct timespec *restrict time_point) +{ + int err_code = __pthread_mutex_timedlock ((pthread_mutex_t *)mutex, + time_point); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_trylock.c b/nptl/mtx_trylock.c new file mode 100644 index 0000000..f9b6a69 --- /dev/null +++ b/nptl/mtx_trylock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex try lock implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "thrd_priv.h" + +int +mtx_trylock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_trylock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/mtx_unlock.c b/nptl/mtx_unlock.c new file mode 100644 index 0000000..07f68f6 --- /dev/null +++ b/nptl/mtx_unlock.c @@ -0,0 +1,26 @@ +/* C11 threads mutex unlock implementation. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "thrd_priv.h" + +int +mtx_unlock (mtx_t *mutex) +{ + int err_code = __pthread_mutex_unlock ((pthread_mutex_t *) mutex); + return thrd_err_map (err_code); +} diff --git a/nptl/threads.h b/nptl/threads.h index 5258e23..13d0075 100644 --- a/nptl/threads.h +++ b/nptl/threads.h @@ -24,6 +24,7 @@ __BEGIN_DECLS +#include <bits/pthreadtypes-arch.h> #include <bits/types/struct_timespec.h> typedef unsigned long int thrd_t; @@ -39,6 +40,20 @@ enum thrd_timedout = 4 }; +/* Mutex types. */ +enum +{ + mtx_plain = 0, + mtx_recursive = 1, + mtx_timed = 2 +}; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_MUTEX_T]; + long int __align __LOCK_ALIGNMENT; +} mtx_t; + /* Threads functions. */ /* Create a new thread executing the function __FUNC. Arguments for __FUNC @@ -85,6 +100,35 @@ thrd_equal (thrd_t __thread1, thrd_t __thread2) } #endif + +/* Mutex functions. */ + +/* Creates a new mutex object with type __TYPE. If successful the new + object is pointed by __MUTEX. */ +extern int mtx_init (mtx_t *__mutex, int __type); + +/* Block the current thread until the mutex pointed to by __MUTEX is + unlocked. In that case current thread will not be blocked. */ +extern int mtx_lock (mtx_t *__mutex); + +/* Block the current thread until the mutex pointed by __MUTEX is unlocked + or time pointed by __TIME_POINT is reached. In case the mutex is unlock, + the current thread will not be blocked. */ +extern int mtx_timedlock (mtx_t *__restrict __mutex, + const struct timespec *__restrict __time_point); + +/* Try to lock the mutex pointed by __MUTEX without blocking. If the mutex + is free the current threads takes control of it, otherwise it returns + immediately. */ +extern int mtx_trylock (mtx_t *__mutex); + +/* Unlock the mutex pointed by __MUTEX. It may potentially awake other + threads waiting on this mutex. */ +extern int mtx_unlock (mtx_t *__mutex); + +/* Destroy the mutex object pointed by __MUTEX. */ +extern void mtx_destroy (mtx_t *__mutex); + __END_DECLS #endif /* _THREADS_H */ |