summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_create.c
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2003-04-22 20:28:33 +0000
committerdeischen <deischen@FreeBSD.org>2003-04-22 20:28:33 +0000
commit23350dd1f55e20a596f9e469feca743c7fe997ec (patch)
tree19f3d1be5afa27ed30120ee055e1c276564167d9 /lib/libpthread/thread/thr_create.c
parent18f0a39a3fe1da16212e6fc2c570431b6fac7fff (diff)
downloadFreeBSD-src-23350dd1f55e20a596f9e469feca743c7fe997ec.zip
FreeBSD-src-23350dd1f55e20a596f9e469feca743c7fe997ec.tar.gz
Add a couple asserts to pthread_cond_foo to ensure the (low-level)
lock level is 0. Thus far, the threads implementation doesn't use mutexes or condition variables so the lock level should be 0. Save the return value when trying to schedule a new thread and use this to return an error from pthread_create(). Change the max sleep time for an idle KSE to 1 minute from 2 minutes. Maintain a count of the number of KSEs within a KSEG. With these changes scope system threads seem to work, but heavy use of them crash the kernel (supposedly VM bugs).
Diffstat (limited to 'lib/libpthread/thread/thr_create.c')
-rw-r--r--lib/libpthread/thread/thr_create.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/libpthread/thread/thr_create.c b/lib/libpthread/thread/thr_create.c
index c38b267..deb26de 100644
--- a/lib/libpthread/thread/thr_create.c
+++ b/lib/libpthread/thread/thr_create.c
@@ -57,6 +57,7 @@ int _thread_ctx_offset = OFF(tmbx.tm_context);
int _thread_PS_RUNNING_value = PS_RUNNING;
int _thread_PS_DEAD_value = PS_DEAD;
+static void free_thread(struct pthread *curthread, struct pthread *thread);
static int create_stack(struct pthread_attr *pattr);
static void thread_start(struct pthread *curthread,
void *(*start_routine) (void *), void *arg);
@@ -295,8 +296,10 @@ _pthread_create(pthread_t * thread, const pthread_attr_t * attr,
* Schedule the new thread starting a new KSEG/KSE
* pair if necessary.
*/
- _thr_schedule_add(curthread, new_thread);
+ ret = _thr_schedule_add(curthread, new_thread);
_kse_critical_leave(crit);
+ if (ret != 0)
+ free_thread(curthread, new_thread);
/* Return a pointer to the thread structure: */
(*thread) = new_thread;
@@ -307,6 +310,17 @@ _pthread_create(pthread_t * thread, const pthread_attr_t * attr,
return (ret);
}
+static void
+free_thread(struct pthread *curthread, struct pthread *thread)
+{
+ if ((thread->attr.flags & PTHREAD_SCOPE_SYSTEM) != 0) {
+ /* Free the KSE and KSEG. */
+ _kseg_free(thread->kseg);
+ _kse_free(curthread, thread->kse);
+ }
+ _thr_free(curthread, thread);
+}
+
static int
create_stack(struct pthread_attr *pattr)
{
OpenPOWER on IntegriCloud