* [PATCH] Block signals even in aio helper thread
@ 2004-05-26 4:19 Jakub Jelinek
2004-05-26 15:00 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2004-05-26 4:19 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Glibc hackers
Hi!
While timer and mq helper threads were changed to block all signals,
aio helper thread was not.
The following patch changes even the aio helper thread.
204-05-25 Jakub Jelinek <jakub@redhat.com>
* sysdeps/pthread/aio_notify.c: Use <> instead of "" for aio_misc.h
include.
(aio_start_notify_thread): Define if not defined.
(notify_func_wrapper): Use it.
* sysdeps/pthread/aio_misc.c: Use <> instead of "" for aio_misc.h
include.
(aio_create_helper_thread): Define if not defined.
(__aio_create_helper_thread): New function.
(__aio_enqueue_request): Use aio_create_helper_thread.
nptl/
* sydeps/unix/sysv/linux/aio_misc.h: New file.
--- libc/sysdeps/pthread/aio_notify.c.jj 2003-08-14 11:05:29.000000000 +0200
+++ libc/sysdeps/pthread/aio_notify.c 2004-05-25 18:41:25.000000000 +0200
@@ -1,5 +1,6 @@
/* Notify initiator of AIO request.
- Copyright (C) 1997,98,99,2000,2001,2003 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -22,8 +23,11 @@
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
-#include "aio_misc.h"
+#include <aio_misc.h>
+#ifndef aio_start_notify_thread
+# define aio_start_notify_thread() do { } while (0)
+#endif
struct notify_func
{
@@ -34,6 +38,7 @@ struct notify_func
static void *
notify_func_wrapper (void *arg)
{
+ aio_start_notify_thread ();
struct notify_func *const n = arg;
void (*func) (sigval_t) = n->func;
sigval_t value = n->value;
--- libc/sysdeps/pthread/aio_misc.c.jj 2003-08-14 11:05:29.000000000 +0200
+++ libc/sysdeps/pthread/aio_misc.c 2004-05-25 19:10:27.000000000 +0200
@@ -27,8 +27,27 @@
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
+#include <aio_misc.h>
-#include "aio_misc.h"
+#ifndef aio_create_helper_thread
+# define aio_create_helper_thread __aio_create_helper_thread
+
+extern inline int
+__aio_create_helper_thread (pthread_t *threadp, void *(*tf) (void *), void *arg)
+{
+ pthread_attr_t attr;
+
+ /* Make sure the thread is created detached. */
+ pthread_attr_init (&attr);
+ pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+
+ int ret = pthread_create (threadp, &attr, tf, arg);
+
+ (void) pthread_attr_destroy (&attr);
+ return ret;
+}
+
+#endif
static void add_request_to_runlist (struct requestlist *newrequest);
@@ -400,16 +419,11 @@ __aio_enqueue_request (aiocb_union *aioc
if (nthreads < optim.aio_threads && idle_thread_count == 0)
{
pthread_t thid;
- pthread_attr_t attr;
-
- /* Make sure the thread is created detached. */
- pthread_attr_init (&attr);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
running = newp->running = allocated;
/* Now try to start a thread. */
- if (pthread_create (&thid, &attr, handle_fildes_io, newp) == 0)
+ if (aio_create_helper_thread (&thid, handle_fildes_io, newp) == 0)
/* We managed to enqueue the request. All errors which can
happen now can be recognized by calls to `aio_return' and
`aio_error'. */
--- libc/nptl/sysdeps/unix/sysv/linux/aio_misc.h.jj 2004-05-25 18:40:57.000000000 +0200
+++ libc/nptl/sysdeps/unix/sysv/linux/aio_misc.h 2004-05-25 19:09:30.000000000 +0200
@@ -0,0 +1,67 @@
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
+
+ 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; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _AIO_MISC_H
+# include_next <aio_misc.h>
+# include <signal.h>
+# include <sysdep.h>
+# include <pthread.h>
+
+# define aio_start_notify_thread __aio_start_notify_thread
+# define aio_create_helper_thread __aio_create_helper_thread
+
+extern inline void
+__aio_start_notify_thread (void)
+{
+ sigset_t ss;
+ sigemptyset (&ss);
+ INTERNAL_SYSCALL_DECL (err);
+ INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &ss, NULL, _NSIG / 8);
+}
+
+extern inline int
+__aio_create_helper_thread (pthread_t *threadp, void *(*tf) (void *), void *arg)
+{
+ pthread_attr_t attr;
+
+ /* Make sure the thread is created detached. */
+ pthread_attr_init (&attr);
+ pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+
+ /* The helper thread needs only very little resources. */
+ (void) pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
+
+ /* Block all signals in the helper thread. To do this thoroughly we
+ temporarily have to block all signals here. */
+ sigset_t ss;
+ sigset_t oss;
+ sigfillset (&ss);
+ INTERNAL_SYSCALL_DECL (err);
+ INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &ss, &oss, _NSIG / 8);
+
+ int ret = pthread_create (threadp, &attr, tf, arg);
+
+ /* Restore the signal mask. */
+ INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &oss, NULL,
+ _NSIG / 8);
+
+ (void) pthread_attr_destroy (&attr);
+ return ret;
+}
+#endif
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Block signals even in aio helper thread
2004-05-26 4:19 [PATCH] Block signals even in aio helper thread Jakub Jelinek
@ 2004-05-26 15:00 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2004-05-26 15:00 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Glibc hackers
Applied.
--
⧠Ulrich Drepper ⧠Red Hat, Inc. ⧠444 Castro St ⧠Mountain View, CA â
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2004-05-26 4:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-05-26 4:19 [PATCH] Block signals even in aio helper thread Jakub Jelinek
2004-05-26 15:00 ` Ulrich Drepper
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).