* [hurd,commited 0/6] Make write and pwrite64 cancellation points
@ 2020-06-14 16:57 Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 1/6] htl: Add noreturn attribute on __pthread_exit forward Samuel Thibault
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
Samuel Thibault (6):
htl: Add noreturn attribute on __pthread_exit forward
htl: initialize first and prevent from unloading
htl: Move cleanup stack to variable shared between libc and pthread
htl: Fix cleanup support for IO locking
hurd: Make write and pwrite64 cancellation points
htl: Enable more cancellation tests
htl/Makefile | 1 +
htl/Versions | 1 +
htl/forward.c | 4 +-
htl/libc_pthread_init.c | 2 +
htl/pt-alloc.c | 2 -
htl/pt-cleanup.c | 2 +-
htl/pt-internal.h | 4 +-
nptl/Makefile | 3 +-
sysdeps/htl/libc-lockP.h | 33 +++++++++++
sysdeps/htl/pthread-functions.h | 4 +-
sysdeps/htl/stdio-lock.h | 57 +++++++++++++++++++
sysdeps/mach/hurd/Makefile | 2 +-
sysdeps/mach/hurd/Versions | 2 +
sysdeps/mach/hurd/dl-sysdep.c | 2 +
sysdeps/mach/hurd/i386/localplt.data | 3 +-
sysdeps/mach/hurd/not-cancel.h | 10 +++-
sysdeps/mach/hurd/pwrite64.c | 16 +++---
sysdeps/mach/hurd/pwrite64_nocancel.c | 35 ++++++++++++
sysdeps/mach/hurd/write.c | 13 +++--
sysdeps/mach/hurd/write_nocancel.c | 30 ++++++++++
sysdeps/pthread/Makefile | 8 ++-
.../pthread}/tst-cancel-self-cancelstate.c | 0
{nptl => sysdeps/pthread}/tst-cancel-self.c | 0
{nptl => sysdeps/pthread}/tst-cancel9.c | 0
{nptl => sysdeps/pthread}/tst-cancelx9.c | 0
25 files changed, 202 insertions(+), 32 deletions(-)
create mode 100644 sysdeps/htl/stdio-lock.h
create mode 100644 sysdeps/mach/hurd/pwrite64_nocancel.c
create mode 100644 sysdeps/mach/hurd/write_nocancel.c
rename {nptl => sysdeps/pthread}/tst-cancel-self-cancelstate.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancel-self.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancel9.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancelx9.c (100%)
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd, commited 1/6] htl: Add noreturn attribute on __pthread_exit forward
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 2/6] htl: initialize first and prevent from unloading Samuel Thibault
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
* sysdeps/htl/pthread-functions.h (__pthread_exit): Add noreturn
attribute.
(struct pthread_functions): Add noreturn attribute on ptr___pthread_exit
field.
---
sysdeps/htl/pthread-functions.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sysdeps/htl/pthread-functions.h b/sysdeps/htl/pthread-functions.h
index 9cb7c2c4a5..c3480e9419 100644
--- a/sysdeps/htl/pthread-functions.h
+++ b/sysdeps/htl/pthread-functions.h
@@ -46,7 +46,7 @@ int __pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
int __pthread_cond_timedwait (pthread_cond_t *, pthread_mutex_t *,
const struct timespec *);
int __pthread_equal (pthread_t, pthread_t);
-void __pthread_exit (void *);
+void __pthread_exit (void *) __attribute__ ((__noreturn__));
int __pthread_getschedparam (pthread_t, int *, struct sched_param *);
int __pthread_setschedparam (pthread_t, int,
const struct sched_param *);
@@ -102,7 +102,7 @@ struct pthread_functions
int (*ptr_pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
const struct timespec *);
int (*ptr_pthread_equal) (pthread_t, pthread_t);
- void (*ptr___pthread_exit) (void *);
+ void (*ptr___pthread_exit) (void *) __attribute__ ((__noreturn__));
int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);
int (*ptr_pthread_setschedparam) (pthread_t, int,
const struct sched_param *);
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd,commited 2/6] htl: initialize first and prevent from unloading
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 1/6] htl: Add noreturn attribute on __pthread_exit forward Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 3/6] htl: Move cleanup stack to variable shared between libc and pthread Samuel Thibault
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
libc does not have codepaths for reverting the load of a libpthread.
* htl/Makefile (LDFLAGS-pthread.so): Pass -z nodelete -z initfirst to
linker.
---
htl/Makefile | 1 +
1 file changed, 1 insertion(+)
diff --git a/htl/Makefile b/htl/Makefile
index c424bd512b..326a920fb3 100644
--- a/htl/Makefile
+++ b/htl/Makefile
@@ -205,6 +205,7 @@ $(inst_libdir)/libpthread_syms.a: $(srcdir)/libpthread_syms.a $(+force)
libc-link.so = $(common-objpfx)libc.so
extra-B-pthread.so = -B$(common-objpfx)htl/
+LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
include ../Rules
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd, commited 3/6] htl: Move cleanup stack to variable shared between libc and pthread
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 1/6] htl: Add noreturn attribute on __pthread_exit forward Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 2/6] htl: initialize first and prevent from unloading Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 4/6] htl: Fix cleanup support for IO locking Samuel Thibault
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
If libpthread gets loaded dynamically, the stack needs to already contain the
cleanup handlers of the main thread.
* htl/libc_pthread_init.c (__pthread_cleanup_stack): New per-thread variable.
* htl/Versions (libc): Add __pthread_cleanup_stack as private symbol.
* htl/pt-internal.h (struct __pthread): Remove cancelation_handlers
field.
(__pthread_cleanup_stack): Add variable declaration.
* htl/pt-alloc.c (initialize_pthread): Remove initialization of
cancelation_handlers field.
* htl/pt-cleanup.c (__pthread_get_cleanup_stack): Return the address of
__pthread_cleanup_stack instead of that of the cancelation_handlers
field.
* htl/forward.c: Include <pt-internal.h>.
(dummy_list): Remove variable.
(__pthread_get_cleanup_stack): Return the address of __pthread_cleanup_stack
instead of that of dummy_list.
---
htl/Versions | 1 +
htl/forward.c | 4 ++--
htl/libc_pthread_init.c | 2 ++
htl/pt-alloc.c | 2 --
htl/pt-cleanup.c | 2 +-
htl/pt-internal.h | 4 +++-
6 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/htl/Versions b/htl/Versions
index fd9eefbaee..832cc5d814 100644
--- a/htl/Versions
+++ b/htl/Versions
@@ -29,6 +29,7 @@ libc {
GLIBC_PRIVATE {
__libc_alloca_cutoff;
__libc_pthread_init;
+ __pthread_cleanup_stack;
}
}
diff --git a/htl/forward.c b/htl/forward.c
index dfb7b79327..544e7da058 100644
--- a/htl/forward.c
+++ b/htl/forward.c
@@ -23,6 +23,7 @@
#include <pthread-functions.h>
#include <libc-lock.h>
#include <fork.h>
+#include <pt-internal.h>
/* Pointers to the libc functions. */
struct pthread_functions __libc_pthread_functions attribute_hidden;
@@ -140,6 +141,5 @@ strong_alias (__pthread_setcancelstate, pthread_setcancelstate);
FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0)
-struct __pthread_cancelation_handler *dummy_list;
FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **,
- (void), (), return &dummy_list);
+ (void), (), return &__pthread_cleanup_stack);
diff --git a/htl/libc_pthread_init.c b/htl/libc_pthread_init.c
index cee92f76ee..f617c4e0be 100644
--- a/htl/libc_pthread_init.c
+++ b/htl/libc_pthread_init.c
@@ -19,6 +19,8 @@
#include <string.h>
#include <pthread-functions.h>
+__thread struct __pthread_cancelation_handler *__pthread_cleanup_stack;
+
void
__libc_pthread_init (const struct pthread_functions *functions)
{
diff --git a/htl/pt-alloc.c b/htl/pt-alloc.c
index d4426bb2e3..bf37aca729 100644
--- a/htl/pt-alloc.c
+++ b/htl/pt-alloc.c
@@ -65,8 +65,6 @@ initialize_pthread (struct __pthread *new)
new->state_lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
new->state_cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER;
- new->cancelation_handlers = 0;
-
memset (&new->res_state, '\0', sizeof (new->res_state));
new->tcb = NULL;
diff --git a/htl/pt-cleanup.c b/htl/pt-cleanup.c
index a9a7c95847..7e6149bda9 100644
--- a/htl/pt-cleanup.c
+++ b/htl/pt-cleanup.c
@@ -23,6 +23,6 @@
struct __pthread_cancelation_handler **
__pthread_get_cleanup_stack (void)
{
- return &_pthread_self ()->cancelation_handlers;
+ return &__pthread_cleanup_stack;
}
hidden_def(__pthread_get_cleanup_stack)
diff --git a/htl/pt-internal.h b/htl/pt-internal.h
index 918c207c3e..e0baa6bcda 100644
--- a/htl/pt-internal.h
+++ b/htl/pt-internal.h
@@ -81,7 +81,6 @@ struct __pthread
int cancel_state;
int cancel_type;
int cancel_pending;
- struct __pthread_cancelation_handler *cancelation_handlers;
/* Thread stack. */
void *stackaddr;
@@ -197,6 +196,9 @@ extern pthread_rwlock_t __pthread_threads_lock;
#ifndef _pthread_self
extern struct __pthread *_pthread_self (void);
#endif
+
+/* Stores the stack of cleanup handlers for the thread. */
+extern __thread struct __pthread_cancelation_handler *__pthread_cleanup_stack;
\f
/* Initialize the pthreads library. */
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd,commited 4/6] htl: Fix cleanup support for IO locking
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
` (2 preceding siblings ...)
2020-06-14 16:57 ` [hurd, commited 3/6] htl: Move cleanup stack to variable shared between libc and pthread Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 5/6] hurd: Make write and pwrite64 cancellation points Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 6/6] htl: Enable more cancellation tests Samuel Thibault
5 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
* sysdeps/htl/stdio-lock.h: New file, registers locking cleanup to htl.
* sysdeps/htl/libc-lockP.h: Include <libc-lock.h>.
(__libc_cleanup_region_start, __libc_cleanup_end,
__libc_cleanup_region_end): Override macros from <libc-lock.h> with
versions which register cleanup to htl.
(__pthread_get_cleanup_stack): Make reference weak for skipping
registration on in the static non-libpthread case.
---
sysdeps/htl/libc-lockP.h | 33 +++++++++++++++++++++++
sysdeps/htl/stdio-lock.h | 57 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+)
create mode 100644 sysdeps/htl/stdio-lock.h
diff --git a/sysdeps/htl/libc-lockP.h b/sysdeps/htl/libc-lockP.h
index 4ba3930a13..0c887d707e 100644
--- a/sysdeps/htl/libc-lockP.h
+++ b/sysdeps/htl/libc-lockP.h
@@ -19,6 +19,7 @@
#ifndef _BITS_LIBC_LOCKP_H
#define _BITS_LIBC_LOCKP_H 1
+#include <libc-lock.h>
#include <pthread.h>
#include <pthread-functions.h>
@@ -73,6 +74,36 @@ typedef pthread_key_t __libc_key_t;
__libc_ptf_call (__pthread_setspecific, (KEY, VALUE), 0)
+#undef __libc_cleanup_region_start
+#undef __libc_cleanup_region_end
+#undef __libc_cleanup_end
+
+#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
+ { \
+ struct __pthread_cancelation_handler **__handlers = NULL; \
+ struct __pthread_cancelation_handler __handler; \
+ int _ditit = 0; \
+ if (DOIT && __pthread_get_cleanup_stack != NULL) \
+ { \
+ __handlers = __pthread_get_cleanup_stack (); \
+ __handler.__handler = FCT; \
+ __handler.__arg = ARG; \
+ __handler.__next = *__handlers; \
+ *__handlers = &__handler; \
+ _ditit = 1; \
+ }
+
+#define __libc_cleanup_end(DOIT) \
+ if (_ditit) { \
+ if (DOIT) \
+ __handler.__handler (__handler.__arg); \
+ *__handlers = __handler.__next; \
+ }
+
+#define __libc_cleanup_region_end(DOIT) \
+ __libc_cleanup_end(DOIT) \
+ }
+
/* Functions that are used by this file and are internal to the GNU C
library. */
@@ -154,6 +185,7 @@ weak_extern (__pthread_once)
weak_extern (__pthread_initialize)
weak_extern (__pthread_atfork)
weak_extern (__pthread_setcancelstate)
+weak_extern (__pthread_get_cleanup_stack)
# else
# pragma weak __pthread_mutex_init
# pragma weak __pthread_mutex_destroy
@@ -176,6 +208,7 @@ weak_extern (__pthread_setcancelstate)
# pragma weak __pthread_initialize
# pragma weak __pthread_atfork
# pragma weak __pthread_setcancelstate
+# pragma weak __pthread_get_cleanup_stack
# endif
#endif
diff --git a/sysdeps/htl/stdio-lock.h b/sysdeps/htl/stdio-lock.h
new file mode 100644
index 0000000000..eafd53ad4a
--- /dev/null
+++ b/sysdeps/htl/stdio-lock.h
@@ -0,0 +1,57 @@
+/* Thread package specific definitions of stream lock type. Hurd version.
+ Copyright (C) 2000-2020 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
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _STDIO_LOCK_H
+#define _STDIO_LOCK_H 1
+
+#include <libc-lock.h>
+
+__libc_lock_define_recursive (typedef, _IO_lock_t)
+#define _IO_lock_t_defined 1
+
+/* We need recursive (counting) mutexes. */
+# define _IO_lock_initializer _LIBC_LOCK_RECURSIVE_INITIALIZER
+
+#define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
+#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name)
+#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name)
+#define _IO_lock_trylock(_name) __libc_lock_trylock_recursive (_name)
+#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name)
+
+
+#define _IO_cleanup_region_start(_fct, _fp) \
+ __libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp)
+#define _IO_cleanup_region_start_noarg(_fct) \
+ __libc_cleanup_region_start (1, _fct, NULL)
+#define _IO_cleanup_region_end(_doit) \
+ __libc_cleanup_region_end (_doit)
+
+#if defined _LIBC && IS_IN (libc)
+
+# define _IO_acquire_lock(_fp) \
+ do { \
+ _IO_cleanup_region_start((void (*) (void *)) &_IO_funlockfile, _fp); \
+ _IO_flockfile (_fp);
+# define _IO_release_lock(_fp) \
+ _IO_funlockfile (_fp); \
+ _IO_cleanup_region_end (0); \
+ } while (0)
+
+#endif
+
+#endif /* stdio-lock.h */
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd, commited 5/6] hurd: Make write and pwrite64 cancellation points
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
` (3 preceding siblings ...)
2020-06-14 16:57 ` [hurd,commited 4/6] htl: Fix cleanup support for IO locking Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 6/6] htl: Enable more cancellation tests Samuel Thibault
5 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
and add _nocancel variants.
* sysdeps/mach/hurd/write.c (__libc_write): Call __write_nocancel
surrounded by enabling async cancel, to replace implementation moved
to...
* sysdeps/mach/hurd/write_nocancel.c (__write_nocancel): ... here.
* sysdeps/mach/hurd/pwrite64.c (__libc_pwrite64): Call
__pwrite64_nocancel surrounded by enabling async cancel, to replace
implementation moved to...
* sysdeps/mach/hurd/pwrite64_nocancel.c (__pwrite64_nocancel): ... here.
* sysdeps/mach/hurd/Makefile (sysdep_routines): Add write_nocancel and
pwrite64_nocancel.
* sysdeps/mach/hurd/not-cancel.h (__write_nocancel,
__pwrite64_nocancel): Replace macros with prototypes with a hidden proto on
libc.
* sysdeps/mach/hurd/dl-sysdep.c (__write_nocancel): New alias, check
that it is not hidden.
* sysdeps/mach/hurd/Versions (libc.GLIBC_PRIVATE): Add __write_nocancel.
(ld.GLIBC_PRIVATE): Add __write_nocancel.
* sysdeps/mach/hurd/i386/localplt.data (__write_nocancel): Add
reference.
---
sysdeps/mach/hurd/Makefile | 2 +-
sysdeps/mach/hurd/Versions | 2 ++
sysdeps/mach/hurd/dl-sysdep.c | 2 ++
sysdeps/mach/hurd/i386/localplt.data | 3 ++-
sysdeps/mach/hurd/not-cancel.h | 10 ++++++--
sysdeps/mach/hurd/pwrite64.c | 16 ++++++------
sysdeps/mach/hurd/pwrite64_nocancel.c | 35 +++++++++++++++++++++++++++
sysdeps/mach/hurd/write.c | 13 +++++-----
sysdeps/mach/hurd/write_nocancel.c | 30 +++++++++++++++++++++++
9 files changed, 94 insertions(+), 19 deletions(-)
create mode 100644 sysdeps/mach/hurd/pwrite64_nocancel.c
create mode 100644 sysdeps/mach/hurd/write_nocancel.c
diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile
index bf741058f5..8b74d3f002 100644
--- a/sysdeps/mach/hurd/Makefile
+++ b/sysdeps/mach/hurd/Makefile
@@ -197,7 +197,7 @@ endif
ifeq (io, $(subdir))
sysdep_routines += f_setlk close_nocancel_nostatus read_nocancel \
- pread64_nocancel
+ pread64_nocancel write_nocancel pwrite64_nocancel
endif
ifeq ($(subdir),sunrpc)
diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions
index ce873f33f6..d93ad1264e 100644
--- a/sysdeps/mach/hurd/Versions
+++ b/sysdeps/mach/hurd/Versions
@@ -11,6 +11,7 @@ libc {
# Functions shared with the dynamic linker
__access; __access_noerrno; __libc_read; __libc_write; __libc_lseek64;
__read_nocancel; __pread64_nocancel;
+ __write_nocancel;
__libc_lock_self0; __getcwd;
_dl_init_first;
@@ -51,6 +52,7 @@ ld {
# functions that must be shared with libc
__access; __access_noerrno; __libc_read; __libc_write; __libc_lseek64;
__read_nocancel; __pread64_nocancel;
+ __write_nocancel;
__libc_lock_self0; __getcwd;
}
}
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 1626cd5928..a4eab4c08e 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -396,6 +396,7 @@ libc_hidden_weak (__read)
weak_alias (__read, __read_nocancel)
check_no_hidden(__write);
+check_no_hidden(__write_nocancel);
__ssize_t weak_function
__write (int fd, const void *buf, size_t nbytes)
{
@@ -411,6 +412,7 @@ __write (int fd, const void *buf, size_t nbytes)
return nwrote;
}
libc_hidden_weak (__write)
+ weak_alias (__write, __write_nocancel)
/* This is only used for printing messages (see dl-misc.c). */
check_no_hidden(__writev);
diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data
index c9f3ca66f9..66478dee7a 100644
--- a/sysdeps/mach/hurd/i386/localplt.data
+++ b/sysdeps/mach/hurd/i386/localplt.data
@@ -23,7 +23,8 @@ ld.so: __read ?
ld.so: __read_nocancel
ld.so: __pread64
ld.so: __pread64_nocancel
-ld.so: __write
+ld.so: __write ?
+ld.so: __write_nocancel
ld.so: __writev
ld.so: __libc_lseek64
ld.so: __mmap
diff --git a/sysdeps/mach/hurd/not-cancel.h b/sysdeps/mach/hurd/not-cancel.h
index 8a8f5a9d3c..d2c3e20019 100644
--- a/sysdeps/mach/hurd/not-cancel.h
+++ b/sysdeps/mach/hurd/not-cancel.h
@@ -48,8 +48,12 @@ __typeof (__read) __read_nocancel;
/* Non cancellable pread syscall (LFS version). */
__typeof (__pread64) __pread64_nocancel;
-#define __write_nocancel(fd, buf, n) \
- __write (fd, buf, n)
+/* Non cancellable write syscall. */
+__typeof (__write) __write_nocancel;
+
+/* Non cancellable pwrite syscall (LFS version). */
+__typeof (__pwrite64) __pwrite64_nocancel;
+
#define __writev_nocancel_nostatus(fd, iov, n) \
(void) __writev (fd, iov, n)
# define __waitpid_nocancel(pid, stat_loc, options) \
@@ -60,6 +64,8 @@ __typeof (__pread64) __pread64_nocancel;
#if IS_IN (libc)
hidden_proto (__read_nocancel)
hidden_proto (__pread64_nocancel)
+hidden_proto (__write_nocancel)
+hidden_proto (__pwrite64_nocancel)
hidden_proto (__close_nocancel_nostatus)
#endif
diff --git a/sysdeps/mach/hurd/pwrite64.c b/sysdeps/mach/hurd/pwrite64.c
index d4f3a83982..961b231394 100644
--- a/sysdeps/mach/hurd/pwrite64.c
+++ b/sysdeps/mach/hurd/pwrite64.c
@@ -17,19 +17,17 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <errno.h>
-#include <unistd.h>
-#include <hurd/fd.h>
+#include <sysdep-cancel.h>
+#include <not-cancel.h>
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset)
{
- error_t err;
- if (offset < 0)
- err = EINVAL;
- else
- err = HURD_FD_USE (fd, _hurd_fd_write (descriptor, buf, &nbytes, offset));
- return err ? __hurd_dfail (fd, err) : nbytes;
+ ssize_t ret;
+ int cancel_oldtype = LIBC_CANCEL_ASYNC();
+ ret = __pwrite64_nocancel (fd, buf, nbytes, offset);
+ LIBC_CANCEL_RESET (cancel_oldtype);
+ return ret;
}
#ifndef __libc_pwrite64
diff --git a/sysdeps/mach/hurd/pwrite64_nocancel.c b/sysdeps/mach/hurd/pwrite64_nocancel.c
new file mode 100644
index 0000000000..f6bdbbe0b1
--- /dev/null
+++ b/sysdeps/mach/hurd/pwrite64_nocancel.c
@@ -0,0 +1,35 @@
+/* Write block to given position in file without changing file pointer.
+ Hurd version.
+ Copyright (C) 2001-2020 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <hurd/fd.h>
+#include <not-cancel.h>
+
+ssize_t
+__pwrite64_nocancel (int fd, const void *buf, size_t nbytes, off64_t offset)
+{
+ error_t err;
+ if (offset < 0)
+ err = EINVAL;
+ else
+ err = HURD_FD_USE (fd, _hurd_fd_write (descriptor, buf, &nbytes, offset));
+ return err ? __hurd_dfail (fd, err) : nbytes;
+}
+libc_hidden_weak (__pwrite64_nocancel)
diff --git a/sysdeps/mach/hurd/write.c b/sysdeps/mach/hurd/write.c
index 9e1ade8801..0eea22be4b 100644
--- a/sysdeps/mach/hurd/write.c
+++ b/sysdeps/mach/hurd/write.c
@@ -15,16 +15,17 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <errno.h>
-#include <unistd.h>
-#include <hurd/fd.h>
+#include <sysdep-cancel.h>
+#include <not-cancel.h>
ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
- error_t err = HURD_FD_USE (fd, _hurd_fd_write (descriptor,
- buf, &nbytes, -1));
- return err ? __hurd_dfail (fd, err) : nbytes;
+ ssize_t ret;
+ int cancel_oldtype = LIBC_CANCEL_ASYNC();
+ ret = __write_nocancel (fd, buf, nbytes);
+ LIBC_CANCEL_RESET (cancel_oldtype);
+ return ret;
}
libc_hidden_def (__libc_write)
weak_alias (__libc_write, __write)
diff --git a/sysdeps/mach/hurd/write_nocancel.c b/sysdeps/mach/hurd/write_nocancel.c
new file mode 100644
index 0000000000..ab11c9cdd1
--- /dev/null
+++ b/sysdeps/mach/hurd/write_nocancel.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1991-2020 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <hurd/fd.h>
+#include <not-cancel.h>
+
+ssize_t
+__write_nocancel (int fd, const void *buf, size_t nbytes)
+{
+ error_t err = HURD_FD_USE (fd, _hurd_fd_write (descriptor,
+ buf, &nbytes, -1));
+ return err ? __hurd_dfail (fd, err) : nbytes;
+}
+libc_hidden_weak (__write_nocancel)
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [hurd,commited 6/6] htl: Enable more cancellation tests
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
` (4 preceding siblings ...)
2020-06-14 16:57 ` [hurd, commited 5/6] hurd: Make write and pwrite64 cancellation points Samuel Thibault
@ 2020-06-14 16:57 ` Samuel Thibault
2020-06-17 13:26 ` Andreas Schwab
5 siblings, 1 reply; 9+ messages in thread
From: Samuel Thibault @ 2020-06-14 16:57 UTC (permalink / raw)
To: libc-alpha; +Cc: Samuel Thibault, commit-hurd
* nptl/tst-cancel-self-cancelstate.c, tst-cancel-self.c, tst-cancel9.c,
tst-cancelx9.c: Move to...
* sysdeps/pthread: ... here.
* nptl/Makefile: Move corresponding references and rules to...
* sysdeps/pthread/Makefile: ... here.
---
nptl/Makefile | 3 +--
sysdeps/pthread/Makefile | 8 +++++---
{nptl => sysdeps/pthread}/tst-cancel-self-cancelstate.c | 0
{nptl => sysdeps/pthread}/tst-cancel-self.c | 0
{nptl => sysdeps/pthread}/tst-cancel9.c | 0
{nptl => sysdeps/pthread}/tst-cancelx9.c | 0
6 files changed, 6 insertions(+), 5 deletions(-)
rename {nptl => sysdeps/pthread}/tst-cancel-self-cancelstate.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancel-self.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancel9.c (100%)
rename {nptl => sysdeps/pthread}/tst-cancelx9.c (100%)
diff --git a/nptl/Makefile b/nptl/Makefile
index c431ead1c0..3356f2aa11 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -278,9 +278,8 @@ tests = tst-attr2 tst-attr3 tst-default-attr \
tst-sem17 \
tst-tsd3 tst-tsd4 \
tst-cancel4 tst-cancel4_1 tst-cancel4_2 tst-cancel5 \
- tst-cancel7 tst-cancel9 tst-cancel13 \
+ tst-cancel7 tst-cancel13 \
tst-cancel16 tst-cancel17 tst-cancel20 tst-cancel24 \
- tst-cancel-self tst-cancel-self-cancelstate \
tst-cleanup4 \
tst-signal3 \
tst-exec4 tst-exec5 \
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index a8e83d9d16..c9ba6f8f12 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -51,9 +51,10 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \
tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \
tst-basic7 \
+ tst-cancel-self tst-cancel-self-cancelstate \
tst-cancel-self-canceltype tst-cancel-self-testcancel \
tst-cancel1 tst-cancel2 tst-cancel3 \
- tst-cancel6 tst-cancel8 tst-cancel10 tst-cancel11 \
+ tst-cancel6 tst-cancel8 tst-cancel9 tst-cancel10 tst-cancel11 \
tst-cancel12 tst-cancel14 tst-cancel15 tst-cancel18 tst-cancel19 \
tst-cancel21 \
tst-cancel22 tst-cancel23 tst-cancel26 tst-cancel27 tst-cancel28 \
@@ -115,8 +116,8 @@ tests-nolibpthread = tst-unload
CFLAGS-tst-cleanup2.c += -fno-builtin
CFLAGS-tst-cleanupx2.c += -fno-builtin
-tests += tst-cancelx2 tst-cancelx3 tst-cancelx6 tst-cancelx8 tst-cancelx10 \
- tst-cancelx11 tst-cancelx12 tst-cancelx14 tst-cancelx15 \
+tests += tst-cancelx2 tst-cancelx3 tst-cancelx6 tst-cancelx8 tst-cancelx9 \
+ tst-cancelx10 tst-cancelx11 tst-cancelx12 tst-cancelx14 tst-cancelx15 \
tst-cancelx18 tst-cancelx21 \
tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3
@@ -155,6 +156,7 @@ CFLAGS-tst-cancelx2.c += -fexceptions
CFLAGS-tst-cancelx3.c += -fexceptions
CFLAGS-tst-cancelx6.c += -fexceptions
CFLAGS-tst-cancelx8.c += -fexceptions
+CFLAGS-tst-cancelx9.c += -fexceptions
CFLAGS-tst-cancelx10.c += -fexceptions
CFLAGS-tst-cancelx11.c += -fexceptions
CFLAGS-tst-cancelx12.c += -fexceptions
diff --git a/nptl/tst-cancel-self-cancelstate.c b/sysdeps/pthread/tst-cancel-self-cancelstate.c
similarity index 100%
rename from nptl/tst-cancel-self-cancelstate.c
rename to sysdeps/pthread/tst-cancel-self-cancelstate.c
diff --git a/nptl/tst-cancel-self.c b/sysdeps/pthread/tst-cancel-self.c
similarity index 100%
rename from nptl/tst-cancel-self.c
rename to sysdeps/pthread/tst-cancel-self.c
diff --git a/nptl/tst-cancel9.c b/sysdeps/pthread/tst-cancel9.c
similarity index 100%
rename from nptl/tst-cancel9.c
rename to sysdeps/pthread/tst-cancel9.c
diff --git a/nptl/tst-cancelx9.c b/sysdeps/pthread/tst-cancelx9.c
similarity index 100%
rename from nptl/tst-cancelx9.c
rename to sysdeps/pthread/tst-cancelx9.c
--
2.27.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [hurd,commited 6/6] htl: Enable more cancellation tests
2020-06-14 16:57 ` [hurd,commited 6/6] htl: Enable more cancellation tests Samuel Thibault
@ 2020-06-17 13:26 ` Andreas Schwab
2020-06-17 13:58 ` Samuel Thibault
0 siblings, 1 reply; 9+ messages in thread
From: Andreas Schwab @ 2020-06-17 13:26 UTC (permalink / raw)
To: Samuel Thibault; +Cc: libc-alpha, bug-hurd, commit-hurd
../Rules:219: target '/suse/schwab/src/libc/test/nptl/tst-cancelx9' given more than once in the same rule
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [hurd,commited 6/6] htl: Enable more cancellation tests
2020-06-17 13:26 ` Andreas Schwab
@ 2020-06-17 13:58 ` Samuel Thibault
0 siblings, 0 replies; 9+ messages in thread
From: Samuel Thibault @ 2020-06-17 13:58 UTC (permalink / raw)
To: Andreas Schwab; +Cc: libc-alpha, bug-hurd, commit-hurd
Andreas Schwab, le mer. 17 juin 2020 15:26:30 +0200, a ecrit:
> ../Rules:219: target '/suse/schwab/src/libc/test/nptl/tst-cancelx9' given more than once in the same rule
It seems I missed the "remove" part of the move of that commit indeed,
now fixed.
Thanks,
Samuel
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-06-17 13:58 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-14 16:57 [hurd,commited 0/6] Make write and pwrite64 cancellation points Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 1/6] htl: Add noreturn attribute on __pthread_exit forward Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 2/6] htl: initialize first and prevent from unloading Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 3/6] htl: Move cleanup stack to variable shared between libc and pthread Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 4/6] htl: Fix cleanup support for IO locking Samuel Thibault
2020-06-14 16:57 ` [hurd, commited 5/6] hurd: Make write and pwrite64 cancellation points Samuel Thibault
2020-06-14 16:57 ` [hurd,commited 6/6] htl: Enable more cancellation tests Samuel Thibault
2020-06-17 13:26 ` Andreas Schwab
2020-06-17 13:58 ` Samuel Thibault
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).