From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23869 invoked by alias); 25 May 2004 20:31:28 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 23849 invoked from network); 25 May 2004 20:31:28 -0000 Received: from unknown (HELO sunsite.ms.mff.cuni.cz) (195.113.15.26) by sourceware.org with SMTP; 25 May 2004 20:31:28 -0000 Received: from sunsite.ms.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8) with ESMTP id i4PII93j001754; Tue, 25 May 2004 20:18:09 +0200 Received: (from jakub@localhost) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8/Submit) id i4PII9fV001734; Tue, 25 May 2004 20:18:09 +0200 Date: Wed, 26 May 2004 04:19:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Block signals even in aio helper thread Message-ID: <20040525181809.GS5191@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2004-05/txt/msg00040.txt.bz2 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 * 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 , 1997. @@ -22,8 +23,11 @@ #include #include #include -#include "aio_misc.h" +#include +#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 #include #include +#include -#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 , 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 +# include +# include +# include + +# 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