diff options
author | deischen <deischen@FreeBSD.org> | 2001-01-24 13:01:12 +0000 |
---|---|---|
committer | deischen <deischen@FreeBSD.org> | 2001-01-24 13:01:12 +0000 |
commit | 1635c221b7b2678beeeb2b5fa728edd7c8c3735b (patch) | |
tree | d7d4f61b9e319a781a335702fe846592726c22b9 /lib/libc/stdlib | |
parent | 08685e9e9fd9de1e8dc51cada55659344adaf0cc (diff) | |
download | FreeBSD-src-1635c221b7b2678beeeb2b5fa728edd7c8c3735b.zip FreeBSD-src-1635c221b7b2678beeeb2b5fa728edd7c8c3735b.tar.gz |
Remove _THREAD_SAFE and make libc thread-safe by default by
adding (weak definitions to) stubs for some of the pthread
functions. If the threads library is linked in, the real
pthread functions will pulled in.
Use the following convention for system calls wrapped by the
threads library:
__sys_foo - actual system call
_foo - weak definition to __sys_foo
foo - weak definition to __sys_foo
Change all libc uses of system calls wrapped by the threads
library from foo to _foo. In order to define the prototypes
for _foo(), we introduce namespace.h and un-namespace.h
(suggested by bde). All files that need to reference these
system calls, should include namespace.h before any standard
includes, then include un-namespace.h after the standard
includes and before any local includes. <db.h> is an exception
and shouldn't be included in between namespace.h and
un-namespace.h namespace.h will define foo to _foo, and
un-namespace.h will undefine foo.
Try to eliminate some of the recursive calls to MT-safe
functions in libc/stdio in preparation for adding a mutex
to FILE. We have recursive mutexes, but would like to avoid
using them if possible.
Remove uneeded includes of <errno.h> from a few files.
Add $FreeBSD$ to a few files in order to pass commitprep.
Approved by: -arch
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r-- | lib/libc/stdlib/abort.c | 33 | ||||
-rw-r--r-- | lib/libc/stdlib/exit.c | 9 | ||||
-rw-r--r-- | lib/libc/stdlib/malloc.c | 2 | ||||
-rw-r--r-- | lib/libc/stdlib/random.c | 2 | ||||
-rw-r--r-- | lib/libc/stdlib/realpath.c | 2 | ||||
-rw-r--r-- | lib/libc/stdlib/system.c | 24 |
6 files changed, 41 insertions, 31 deletions
diff --git a/lib/libc/stdlib/abort.c b/lib/libc/stdlib/abort.c index b6b4be9..0b85182 100644 --- a/lib/libc/stdlib/abort.c +++ b/lib/libc/stdlib/abort.c @@ -29,6 +29,8 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $FreeBSD$ */ #if defined(LIBC_SCCS) && !defined(lint) @@ -39,17 +41,18 @@ static char sccsid[] = "@(#)abort.c 8.1 (Berkeley) 6/4/93"; #include <stdlib.h> #include <stddef.h> #include <unistd.h> -#ifdef _THREAD_SAFE #include <pthread.h> -#include "pthread_private.h" -#endif void (*__cleanup)(); +extern int __sys_sigprocmask(int, const sigset_t *, sigset_t *); +extern int __sys_sigaction(int, const struct sigaction *, + struct sigaction *); + void abort() { - sigset_t mask; + struct sigaction act; /* * POSIX requires we flush stdio buffers on abort @@ -57,29 +60,25 @@ abort() if (__cleanup) (*__cleanup)(); - sigfillset(&mask); + sigfillset(&act.sa_mask); /* * don't block SIGABRT to give any handler a chance; we ignore * any errors -- X311J doesn't allow abort to return anyway. */ - sigdelset(&mask, SIGABRT); -#ifdef _THREAD_SAFE - (void) _thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); -#else - (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); -#endif + sigdelset(&act.sa_mask, SIGABRT); + (void)__sys_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL); (void)kill(getpid(), SIGABRT); /* * if SIGABRT ignored, or caught and the handler returns, do * it again, only harder. */ - (void)signal(SIGABRT, SIG_DFL); -#ifdef _THREAD_SAFE - (void) _thread_sys_sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); -#else - (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); -#endif + act.sa_handler = SIG_DFL; + act.sa_flags = 0; + sigfillset(&act.sa_mask); + (void)__sys_sigaction(SIGABRT, &act, NULL); + sigdelset(&act.sa_mask, SIGABRT); + (void)__sys_sigprocmask(SIG_SETMASK, &act.sa_mask, NULL); (void)kill(getpid(), SIGABRT); exit(1); } diff --git a/lib/libc/stdlib/exit.c b/lib/libc/stdlib/exit.c index b0f6d3a..32f51d4 100644 --- a/lib/libc/stdlib/exit.c +++ b/lib/libc/stdlib/exit.c @@ -29,14 +29,18 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $FreeBSD$ */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)exit.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include <stdlib.h> #include <unistd.h> +#include "un-namespace.h" #include "atexit.h" void (*__cleanup)(); @@ -60,11 +64,10 @@ exit(status) register struct atexit *p; register int n; -#ifdef _THREAD_SAFE - extern int _thread_autoinit_dummy_decl; /* Ensure that the auto-initialization routine is linked in: */ + extern int _thread_autoinit_dummy_decl; + _thread_autoinit_dummy_decl = 1; -#endif for (p = __atexit; p; p = p->next) for (n = p->ind; --n >= 0;) diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 91236df..bf6a495 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -42,6 +42,7 @@ * */ +#include "namespace.h" #if defined(__FreeBSD__) # if defined(__i386__) # define malloc_pageshift 12U @@ -97,6 +98,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include "un-namespace.h" /* * This structure describes a page worth of chunks. diff --git a/lib/libc/stdlib/random.c b/lib/libc/stdlib/random.c index e8e8254..a271669 100644 --- a/lib/libc/stdlib/random.c +++ b/lib/libc/stdlib/random.c @@ -38,11 +38,13 @@ static char sccsid[] = "@(#)random.c 8.2 (Berkeley) 5/19/95"; #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include <sys/time.h> /* for srandomdev() */ #include <fcntl.h> /* for srandomdev() */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* for srandomdev() */ +#include "un-namespace.h" /* * random.c: diff --git a/lib/libc/stdlib/realpath.c b/lib/libc/stdlib/realpath.c index 0217dde..2bb8c89 100644 --- a/lib/libc/stdlib/realpath.c +++ b/lib/libc/stdlib/realpath.c @@ -40,6 +40,7 @@ static char sccsid[] = "@(#)realpath.c 8.1 (Berkeley) 2/16/94"; #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include <sys/param.h> #include <sys/stat.h> @@ -48,6 +49,7 @@ static char sccsid[] = "@(#)realpath.c 8.1 (Berkeley) 2/16/94"; #include <stdlib.h> #include <string.h> #include <unistd.h> +#include "un-namespace.h" /* * char *realpath(const char *path, char resolved_path[MAXPATHLEN]); diff --git a/lib/libc/stdlib/system.c b/lib/libc/stdlib/system.c index c7e68ba..3b16454 100644 --- a/lib/libc/stdlib/system.c +++ b/lib/libc/stdlib/system.c @@ -37,6 +37,7 @@ static char sccsid[] = "@(#)system.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include <sys/types.h> #include <sys/wait.h> #include <signal.h> @@ -45,6 +46,8 @@ static char sccsid[] = "@(#)system.c 8.1 (Berkeley) 6/4/93"; #include <unistd.h> #include <paths.h> #include <errno.h> +#include "un-namespace.h" +#include "libc_private.h" int __system(command) @@ -65,11 +68,11 @@ __system(command) ign.sa_handler = SIG_IGN; (void)sigemptyset(&ign.sa_mask); ign.sa_flags = 0; - (void)sigaction(SIGINT, &ign, &intact); - (void)sigaction(SIGQUIT, &ign, &quitact); + (void)_sigaction(SIGINT, &ign, &intact); + (void)_sigaction(SIGQUIT, &ign, &quitact); (void)sigemptyset(&newsigblock); (void)sigaddset(&newsigblock, SIGCHLD); - (void)sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); + (void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); switch(pid = fork()) { case -1: /* error */ break; @@ -77,9 +80,9 @@ __system(command) /* * Restore original signal dispositions and exec the command. */ - (void)sigaction(SIGINT, &intact, NULL); - (void)sigaction(SIGQUIT, &quitact, NULL); - (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + (void)_sigaction(SIGINT, &intact, NULL); + (void)_sigaction(SIGQUIT, &quitact, NULL); + (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL); execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); _exit(127); default: /* parent */ @@ -88,12 +91,11 @@ __system(command) } while (pid == -1 && errno == EINTR); break; } - (void)sigaction(SIGINT, &intact, NULL); - (void)sigaction(SIGQUIT, &quitact, NULL); - (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + (void)_sigaction(SIGINT, &intact, NULL); + (void)_sigaction(SIGQUIT, &quitact, NULL); + (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL); return(pid == -1 ? -1 : pstat); } -#ifndef _THREAD_SAFE __weak_reference(__system, system); -#endif +__weak_reference(__system, _system); |