summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2001-01-24 13:01:12 +0000
committerdeischen <deischen@FreeBSD.org>2001-01-24 13:01:12 +0000
commit1635c221b7b2678beeeb2b5fa728edd7c8c3735b (patch)
treed7d4f61b9e319a781a335702fe846592726c22b9 /lib/libc/stdlib
parent08685e9e9fd9de1e8dc51cada55659344adaf0cc (diff)
downloadFreeBSD-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.c33
-rw-r--r--lib/libc/stdlib/exit.c9
-rw-r--r--lib/libc/stdlib/malloc.c2
-rw-r--r--lib/libc/stdlib/random.c2
-rw-r--r--lib/libc/stdlib/realpath.c2
-rw-r--r--lib/libc/stdlib/system.c24
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);
OpenPOWER on IntegriCloud