summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>2005-09-24 01:19:53 +0000
committerBrian Somers <brian@FreeBSD.org>2005-09-24 01:19:53 +0000
commit225721f00bb36b2f3b6560c5d62c046a72f46776 (patch)
tree9cfd706f8848e787805d497398e496a7fcaf985f
parentbb13d7dc5e5ba7f8c3adcaf90cedcd9ce371d36e (diff)
Notes
-rw-r--r--lib/libkse/thread/thr_init.c2
-rw-r--r--lib/libkse/thread/thr_kern.c17
-rw-r--r--lib/libpthread/thread/thr_init.c2
-rw-r--r--lib/libpthread/thread/thr_kern.c17
4 files changed, 22 insertions, 16 deletions
diff --git a/lib/libkse/thread/thr_init.c b/lib/libkse/thread/thr_init.c
index c14362732b036..e5439ad57aa88 100644
--- a/lib/libkse/thread/thr_init.c
+++ b/lib/libkse/thread/thr_init.c
@@ -437,6 +437,7 @@ init_private(void)
}
_pthread_attr_default.guardsize_attr = _thr_guard_default;
_pthread_attr_default.stacksize_attr = _thr_stack_default;
+ TAILQ_INIT(&_thr_atfork_list);
init_once = 1; /* Don't do this again. */
} else {
/*
@@ -453,7 +454,6 @@ init_private(void)
/* Initialize everything else. */
TAILQ_INIT(&_thread_list);
TAILQ_INIT(&_thread_gc_list);
- TAILQ_INIT(&_thr_atfork_list);
_pthread_mutex_init(&_thr_atfork_mutex, NULL);
/*
diff --git a/lib/libkse/thread/thr_kern.c b/lib/libkse/thread/thr_kern.c
index d57665e89a9ca..be763c2401048 100644
--- a/lib/libkse/thread/thr_kern.c
+++ b/lib/libkse/thread/thr_kern.c
@@ -55,6 +55,9 @@ __FBSDID("$FreeBSD$");
#include "atomic_ops.h"
#include "thr_private.h"
#include "libc_private.h"
+#ifdef NOTYET
+#include "spinlock.h"
+#endif
/* #define DEBUG_THREAD_KERN */
#ifdef DEBUG_THREAD_KERN
@@ -210,9 +213,9 @@ _kse_single_thread(struct pthread *curthread)
struct kse *kse;
struct kse_group *kseg;
struct pthread *thread;
- kse_critical_t crit;
- int i;
+ _thr_spinlock_init();
+ *__malloc_lock = (spinlock_t)_SPINLOCK_INITIALIZER;
if (__isthreaded) {
_thr_rtld_fini();
_thr_signal_deinit();
@@ -250,11 +253,8 @@ _kse_single_thread(struct pthread *curthread)
curthread->joiner = NULL; /* no joining threads yet */
curthread->refcount = 0;
SIGEMPTYSET(curthread->sigpend); /* clear pending signals */
- if (curthread->specific != NULL) {
- free(curthread->specific);
- curthread->specific = NULL;
- curthread->specific_data_count = 0;
- }
+
+ /* Don't free thread-specific data as the caller may require it */
/* Free the free KSEs: */
while ((kse = TAILQ_FIRST(&free_kseq)) != NULL) {
@@ -317,6 +317,9 @@ _kse_single_thread(struct pthread *curthread)
curthread->attr.flags &= ~PTHREAD_SCOPE_SYSTEM;
curthread->attr.flags |= PTHREAD_SCOPE_PROCESS;
+ /* We're no longer part of any lists */
+ curthread->tlflags = 0;
+
/*
* After a fork, we are still operating on the thread's original
* stack. Don't clear the THR_FLAGS_USER from the thread's
diff --git a/lib/libpthread/thread/thr_init.c b/lib/libpthread/thread/thr_init.c
index c14362732b036..e5439ad57aa88 100644
--- a/lib/libpthread/thread/thr_init.c
+++ b/lib/libpthread/thread/thr_init.c
@@ -437,6 +437,7 @@ init_private(void)
}
_pthread_attr_default.guardsize_attr = _thr_guard_default;
_pthread_attr_default.stacksize_attr = _thr_stack_default;
+ TAILQ_INIT(&_thr_atfork_list);
init_once = 1; /* Don't do this again. */
} else {
/*
@@ -453,7 +454,6 @@ init_private(void)
/* Initialize everything else. */
TAILQ_INIT(&_thread_list);
TAILQ_INIT(&_thread_gc_list);
- TAILQ_INIT(&_thr_atfork_list);
_pthread_mutex_init(&_thr_atfork_mutex, NULL);
/*
diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c
index d57665e89a9ca..be763c2401048 100644
--- a/lib/libpthread/thread/thr_kern.c
+++ b/lib/libpthread/thread/thr_kern.c
@@ -55,6 +55,9 @@ __FBSDID("$FreeBSD$");
#include "atomic_ops.h"
#include "thr_private.h"
#include "libc_private.h"
+#ifdef NOTYET
+#include "spinlock.h"
+#endif
/* #define DEBUG_THREAD_KERN */
#ifdef DEBUG_THREAD_KERN
@@ -210,9 +213,9 @@ _kse_single_thread(struct pthread *curthread)
struct kse *kse;
struct kse_group *kseg;
struct pthread *thread;
- kse_critical_t crit;
- int i;
+ _thr_spinlock_init();
+ *__malloc_lock = (spinlock_t)_SPINLOCK_INITIALIZER;
if (__isthreaded) {
_thr_rtld_fini();
_thr_signal_deinit();
@@ -250,11 +253,8 @@ _kse_single_thread(struct pthread *curthread)
curthread->joiner = NULL; /* no joining threads yet */
curthread->refcount = 0;
SIGEMPTYSET(curthread->sigpend); /* clear pending signals */
- if (curthread->specific != NULL) {
- free(curthread->specific);
- curthread->specific = NULL;
- curthread->specific_data_count = 0;
- }
+
+ /* Don't free thread-specific data as the caller may require it */
/* Free the free KSEs: */
while ((kse = TAILQ_FIRST(&free_kseq)) != NULL) {
@@ -317,6 +317,9 @@ _kse_single_thread(struct pthread *curthread)
curthread->attr.flags &= ~PTHREAD_SCOPE_SYSTEM;
curthread->attr.flags |= PTHREAD_SCOPE_PROCESS;
+ /* We're no longer part of any lists */
+ curthread->tlflags = 0;
+
/*
* After a fork, we are still operating on the thread's original
* stack. Don't clear the THR_FLAGS_USER from the thread's