From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12561 invoked by alias); 18 Jun 2002 22:01:31 -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 12440 invoked from network); 18 Jun 2002 22:01:21 -0000 Received: from unknown (HELO sunsite.mff.cuni.cz) (195.113.19.66) by sources.redhat.com with SMTP; 18 Jun 2002 22:01:21 -0000 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.11.6/8.11.6) id g5IM1II24893; Wed, 19 Jun 2002 00:01:18 +0200 Date: Tue, 18 Jun 2002 15:01:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Fix __fork Message-ID: <20020619000118.B20867@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.2.5.1i X-SW-Source: 2002-06/txt/msg00026.txt.bz2 Hi! The following program hangs: #include #include void * thread_func (void *arg) { return 0; } int main (int argc, char **argv) { pthread_t thread; pthread_create (&thread, 0, thread_func, 0); system ("/bin/echo Hello, world!"); return 0; } the reason is that some libc.so PLT removal got too far, particularly we need to call fork/__fork from libpthread in threaded programs. Here is a patch which backs out the __fork -> __fork_internal changes and makes the above testcase work. I wonder if read, write, open, close, sendto, recvfrom, select, etc. (and their __* counterparts) called from glibc don't have to go to libpthread too, because otherwise if they block they will not be cancellation points. For open/close I think we can guess that they will not block if we are not opening some device, but for the rest they will probably block. 2002-06-18 Jakub Jelinek * include/unistd.h (__fork_internal): Remove. (__fork): Don't define to __fork_internal. * sysdeps/mach/hurd/fork.c (__fork): Remove INTDEF. * sysdeps/unix/sysv/aix/fork.c (__fork): Likewise. * sysdeps/unix/sysv/linux/ia64/fork.S (__fork_internal): Remove alias. * sysdeps/unix/sysv/linux/sparc/fork.S (__fork_internal): Likewise. * sysdeps/unix/sysv/linux/syscalls.list (__fork_internal): Likewise. --- libc/include/unistd.h.jj Tue Apr 30 15:15:00 2002 +++ libc/include/unistd.h Tue Jun 18 23:50:14 2002 @@ -92,7 +92,6 @@ extern ssize_t __write (int __fd, __cons extern ssize_t __write_internal (int __fd, __const void *__buf, size_t __n) attribute_hidden; extern __pid_t __fork (void); -extern __pid_t __fork_internal (void) attribute_hidden; extern int __getpagesize (void) __attribute__ ((__const__)); extern int __getpagesize_internal (void) __attribute__ ((__const__)) attribute_hidden; @@ -120,7 +119,6 @@ extern void __libc_check_standard_fds (v #ifndef NOT_IN_libc # define __close(fd) INTUSE(__close) (fd) # define __dup2(fd, fd2) INTUSE(__dup2) (fd, fd2) -# define __fork() INTUSE(__fork) () # define __getpagesize() INTUSE(__getpagesize) () # define __getpgid(pid) INTUSE(__getpgid) (pid) # define __getpid() INTUSE(__getpid) () --- libc/sysdeps/mach/hurd/fork.c.jj Tue Apr 30 12:54:57 2002 +++ libc/sysdeps/mach/hurd/fork.c Tue Jun 18 23:50:53 2002 @@ -677,5 +677,4 @@ __fork (void) return err ? __hurd_fail (err) : pid; } -INTDEF(__fork) weak_alias (__fork, fork) --- libc/sysdeps/unix/sysv/aix/fork.c.jj Tue Apr 30 12:56:36 2002 +++ libc/sysdeps/unix/sysv/aix/fork.c Tue Jun 18 23:51:10 2002 @@ -25,5 +25,4 @@ __fork (void) { return kfork (); } -INTDEF(__fork) strong_alias (__fork, fork) --- libc/sysdeps/unix/sysv/linux/ia64/fork.S.jj Tue Apr 30 12:56:54 2002 +++ libc/sysdeps/unix/sysv/linux/ia64/fork.S Tue Jun 18 23:47:44 2002 @@ -37,6 +37,5 @@ ENTRY(__libc_fork) ret PSEUDO_END(__libc_fork) -strong_alias (__libc_fork, __fork_internal) weak_alias (__libc_fork, __fork) weak_alias (__libc_fork, fork) --- libc/sysdeps/unix/sysv/linux/sparc/fork.S.jj Wed Jun 5 10:27:57 2002 +++ libc/sysdeps/unix/sysv/linux/sparc/fork.S Tue Jun 18 23:47:22 2002 @@ -25,6 +25,5 @@ PSEUDO (__libc_fork, fork, 0) and %o0, %o1, %o0 PSEUDO_END (__libc_fork) -strong_alias (__libc_fork, __fork_internal) weak_alias (__libc_fork, __fork) weak_alias (__libc_fork, fork) --- libc/sysdeps/unix/sysv/linux/syscalls.list.jj Thu Jun 6 23:28:17 2002 +++ libc/sysdeps/unix/sysv/linux/syscalls.list Tue Jun 18 23:51:41 2002 @@ -8,7 +8,7 @@ create_module EXTRA create_module 3 crea delete_module EXTRA delete_module 3 delete_module fdatasync - fdatasync i:i fdatasync flock - flock i:ii __flock flock -fork - fork i: __libc_fork __fork fork __fork_internal +fork - fork i: __libc_fork __fork fork get_kernel_syms EXTRA get_kernel_syms i:p get_kernel_syms getegid - getegid i: __getegid getegid geteuid - geteuid i: __geteuid geteuid Jakub