diff options
Diffstat (limited to 'libpthread')
84 files changed, 178 insertions, 5710 deletions
diff --git a/libpthread/linuxthreads/Makefile.in b/libpthread/linuxthreads/Makefile.in index ffdd5d4eb..cc2a5f285 100644 --- a/libpthread/linuxthreads/Makefile.in +++ b/libpthread/linuxthreads/Makefile.in @@ -16,6 +16,8 @@ libpthread_OUT := $(top_builddir)libpthread/linuxthreads -include $(libpthread_DIR)/sysdeps/$(TARGET_ARCH)/Makefile.arch +CFLAGS-signals.c = -fexceptions -fasynchronous-unwind-tables + libpthread_SRC := \ attr.c cancel.c condvar.c errno.c events.c join.c lockfile.c manager.c \ mutex.c pt-machine.c ptfork.c pthread.c ptlongjmp.c \ diff --git a/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h b/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h index bbdb0739c..6d7c4d70a 100644 --- a/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h +++ b/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h @@ -19,6 +19,7 @@ #include <sys/types.h> #include <sysdep.h> +#include <time.h> /* Uncancelable open. */ #if defined __NR_openat && !defined __NR_open @@ -104,6 +105,7 @@ extern int __openat64_nocancel (int fd, const char *fname, int oflag, # define nanosleep_not_cancel(requested_time, remaining) \ INLINE_SYSCALL (nanosleep, 2, requested_time, remaining) #else +extern int __nanosleep_nocancel (const struct timespec *requested_time, struct timespec *remaining); # define nanosleep_not_cancel(requested_time, remaining) \ __nanosleep_nocancel (requested_time, remaining) #endif diff --git a/libpthread/linuxthreads/sysdeps/riscv32/pt-machine.h b/libpthread/linuxthreads/sysdeps/riscv32/pt-machine.h new file mode 100644 index 000000000..38f0d8eff --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/riscv32/pt-machine.h @@ -0,0 +1,61 @@ +/* + * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + */ + +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H 1 +#include <features.h> + +#ifndef PT_EI +# define PT_EI __extern_always_inline +#endif + +#define HAS_COMPARE_AND_SWAP +PT_EI int +__compare_and_swap (long int *p, long int oldval, long int newval) +{ + long int ret, temp; + + __asm__ __volatile__ + ("/* Inline compare & swap */\n" + "1:\n\t" + "lr.w %1,%2\n\t" + "li %0,0\n\t" + "bne %1,%3,2f\n\t" + "li %0,1\n\t" + "sc.w %1,%4,%2\n\t" + "bnez %1,1b\n" + "2:\n\t" + "/* End compare & swap */" + : "=&r" (ret), "=&r" (temp), "+A" (*p) + : "r" (oldval), "r" (newval) + : "memory"); + + return ret; +} + +extern long int testandset (int *spinlock); + +PT_EI long int +testandset (int *spinlock) +{ + unsigned int old = 1; + int tmp = 1; + + __asm__ __volatile__ ( + "amoswap.w %0, %2, %1" + : "=r" (old), "+A" (*spinlock) + : "r" (tmp) + : "memory"); + + return old; +} + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#define CURRENT_STACK_FRAME stack_pointer +register char * stack_pointer __asm__ ("sp"); + +#else +#error PT_MACHINE already defined +#endif /* pt-machine.h */ diff --git a/libpthread/nptl/allocatestack.c b/libpthread/nptl/allocatestack.c index 7ef884543..941ef22f0 100644 --- a/libpthread/nptl/allocatestack.c +++ b/libpthread/nptl/allocatestack.c @@ -24,6 +24,7 @@ #include <unistd.h> #include <sys/mman.h> #include <sys/param.h> +#include <dl-tls.h> #include <tls.h> #include <lowlevellock.h> #include <link.h> @@ -241,6 +242,10 @@ get_cached_stack (size_t *sizep, void **memp) /* Clear the DTV. */ dtv_t *dtv = GET_DTV (TLS_TPADJ (result)); + for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt) + if (! dtv[1 + cnt].pointer.is_static + && dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED) + free (dtv[1 + cnt].pointer.val); memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t)); /* Re-initialize the TLS. */ diff --git a/libpthread/nptl/pthread_create.c b/libpthread/nptl/pthread_create.c index 697af20e0..3d83a51fe 100644 --- a/libpthread/nptl/pthread_create.c +++ b/libpthread/nptl/pthread_create.c @@ -551,11 +551,11 @@ pthread_create ( return 0; } - + /* Information for libthread_db. */ #include "../nptl_db/db_info.c" - + /* If pthread_create is present, libgcc_eh.a and libsupc++.a expects some other POSIX thread functions to be present as well. */ PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_lock) diff --git a/libpthread/nptl/sysdeps/arc/dl-tls.h b/libpthread/nptl/sysdeps/arc/dl-tls.h index 34e54e4d3..e81c0c187 100644 --- a/libpthread/nptl/sysdeps/arc/dl-tls.h +++ b/libpthread/nptl/sysdeps/arc/dl-tls.h @@ -26,3 +26,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/arm/dl-tls.h b/libpthread/nptl/sysdeps/arm/dl-tls.h index a728455e4..a79ea7160 100644 --- a/libpthread/nptl/sysdeps/arm/dl-tls.h +++ b/libpthread/nptl/sysdeps/arm/dl-tls.h @@ -26,3 +26,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/csky/dl-tls.h b/libpthread/nptl/sysdeps/csky/dl-tls.h index ebf1a7dc3..7171d47ea 100644 --- a/libpthread/nptl/sysdeps/csky/dl-tls.h +++ b/libpthread/nptl/sysdeps/csky/dl-tls.h @@ -14,3 +14,5 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/generic/dl-tls.c b/libpthread/nptl/sysdeps/generic/dl-tls.c index 7d25e4706..7b7991be8 100644 --- a/libpthread/nptl/sysdeps/generic/dl-tls.c +++ b/libpthread/nptl/sysdeps/generic/dl-tls.c @@ -45,8 +45,6 @@ to allow dynamic loading of modules defining IE-model TLS data. */ # define TLS_STATIC_SURPLUS 64 + DL_NNS * 100 -/* Value used for dtv entries for which the allocation is delayed. */ -# define TLS_DTV_UNALLOCATED ((void *) -1l) #ifndef SHARED extern dtv_t static_dtv; diff --git a/libpthread/nptl/sysdeps/i386/dl-tls.h b/libpthread/nptl/sysdeps/i386/dl-tls.h index 32495c1e0..004082407 100644 --- a/libpthread/nptl/sysdeps/i386/dl-tls.h +++ b/libpthread/nptl/sysdeps/i386/dl-tls.h @@ -59,3 +59,6 @@ strong_alias (___tls_get_addr, ___tls_get_addr_internal) # endif #endif + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/metag/dl-tls.h b/libpthread/nptl/sysdeps/metag/dl-tls.h index 81632e057..811d6254f 100644 --- a/libpthread/nptl/sysdeps/metag/dl-tls.h +++ b/libpthread/nptl/sysdeps/metag/dl-tls.h @@ -26,3 +26,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/microblaze/dl-tls.h b/libpthread/nptl/sysdeps/microblaze/dl-tls.h index 5613e21e2..ded8714bd 100644 --- a/libpthread/nptl/sysdeps/microblaze/dl-tls.h +++ b/libpthread/nptl/sysdeps/microblaze/dl-tls.h @@ -24,3 +24,6 @@ typedef struct } tls_index; extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/mips/dl-tls.h b/libpthread/nptl/sysdeps/mips/dl-tls.h index e26aa388b..63ec2bc00 100644 --- a/libpthread/nptl/sysdeps/mips/dl-tls.h +++ b/libpthread/nptl/sysdeps/mips/dl-tls.h @@ -43,3 +43,6 @@ extern void *__tls_get_addr (tls_index *ti); # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/nds32/dl-tls.h b/libpthread/nptl/sysdeps/nds32/dl-tls.h index 3b11e7f42..f0107cacb 100644 --- a/libpthread/nptl/sysdeps/nds32/dl-tls.h +++ b/libpthread/nptl/sysdeps/nds32/dl-tls.h @@ -50,7 +50,7 @@ struct tlsdesc_dynamic_arg extern void *__tls_get_addr (tls_index *ti); extern ptrdiff_t attribute_hidden - _dl_tlsdesc_return(struct tlsdesc_dynamic_arg *); + _dl_tlsdesc_return(struct tlsdesc *); extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset); extern ptrdiff_t attribute_hidden diff --git a/libpthread/nptl/sysdeps/or1k/dl-tls.h b/libpthread/nptl/sysdeps/or1k/dl-tls.h index 5613e21e2..ded8714bd 100644 --- a/libpthread/nptl/sysdeps/or1k/dl-tls.h +++ b/libpthread/nptl/sysdeps/or1k/dl-tls.h @@ -24,3 +24,6 @@ typedef struct } tls_index; extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/powerpc/dl-tls.h b/libpthread/nptl/sysdeps/powerpc/dl-tls.h index c322ade60..ae50098c7 100644 --- a/libpthread/nptl/sysdeps/powerpc/dl-tls.h +++ b/libpthread/nptl/sysdeps/powerpc/dl-tls.h @@ -46,3 +46,6 @@ extern void *__tls_get_addr (tls_index *ti); # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) #endif + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/riscv32/dl-tls.h b/libpthread/nptl/sysdeps/riscv32/dl-tls.h index 31991be0d..4124b7c78 100644 --- a/libpthread/nptl/sysdeps/riscv32/dl-tls.h +++ b/libpthread/nptl/sysdeps/riscv32/dl-tls.h @@ -32,3 +32,6 @@ extern void *__tls_get_addr (tls_index *ti); #define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) #define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed. */ |