From: Jakub Jelinek <jakub@redhat.com>
To: Ulrich Drepper <drepper@redhat.com>
Cc: Glibc hackers <libc-hacker@sources.redhat.com>
Subject: [PATCH] Fix __fork
Date: Tue, 18 Jun 2002 15:01:00 -0000 [thread overview]
Message-ID: <20020619000118.B20867@sunsite.ms.mff.cuni.cz> (raw)
Hi!
The following program hangs:
#include <stdlib.h>
#include <pthread.h>
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 <jakub@redhat.com>
* 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
next reply other threads:[~2002-06-18 22:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-18 15:01 Jakub Jelinek [this message]
2002-06-20 15:46 ` Ulrich Drepper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020619000118.B20867@sunsite.ms.mff.cuni.cz \
--to=jakub@redhat.com \
--cc=drepper@redhat.com \
--cc=libc-hacker@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).