Module Name: src
Committed By: riz
Date: Tue Aug 9 16:18:23 UTC 2011
Modified Files:
src/sys/kern [netbsd-5]: kern_kthread.c
src/sys/sys [netbsd-5]: kthread.h
Log Message:
Pull up following revision(s) (requested by matt in ticket #1652):
sys/sys/kthread.h: revision 1.7.10.1.8.1
sys/kern/kern_kthread.c: revision 1.24.10.2.8.1
Pullup <a rel="nofollow"
href="http://mail-index.netbsd.org/source-changes/2010/05/11/msg009810.html">http://mail-index.netbsd.org/source-changes/2010/05/11/msg009810.html</a>
to this branch because the new flash framework will need it.
To generate a diff of this commit:
cvs rdiff -u -r1.24.10.2 -r1.24.10.3 src/sys/kern/kern_kthread.c
cvs rdiff -u -r1.7.10.1 -r1.7.10.2 src/sys/sys/kthread.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_kthread.c
diff -u src/sys/kern/kern_kthread.c:1.24.10.2 src/sys/kern/kern_kthread.c:1.24.10.3
--- src/sys/kern/kern_kthread.c:1.24.10.2 Mon Feb 2 22:02:24 2009
+++ src/sys/kern/kern_kthread.c Tue Aug 9 16:18:23 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_kthread.c,v 1.24.10.2 2009/02/02 22:02:24 snj Exp $ */
+/* $NetBSD: kern_kthread.c,v 1.24.10.3 2011/08/09 16:18:23 riz Exp $ */
/*-
* Copyright (c) 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_kthread.c,v 1.24.10.2 2009/02/02 22:02:24 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_kthread.c,v 1.24.10.3 2011/08/09 16:18:23 riz Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -52,6 +52,12 @@
/*
* Fork a kernel thread. Any process can request this to be done.
+ *
+ * With joinable kthreads KTHREAD_JOINABLE flag this should be known.
+ * 1. If you specify KTHREAD_JOINABLE, you must call kthread_join() to reap the thread.
+ * It will not be automatically reaped by the system.
+ * 2. For any given call to kthread_create(KTHREAD_JOINABLE), you may call kthread_join()
+ * only once on the returned lwp_t *.
*/
int
kthread_create(pri_t pri, int flag, struct cpu_info *ci,
@@ -61,9 +67,10 @@
lwp_t *l;
vaddr_t uaddr;
bool inmem;
- int error;
+ int error, lc, lwp_flags;
va_list ap;
- int lc;
+
+ lwp_flags = LWP_DETACHED;
inmem = uvm_uarea_alloc(&uaddr);
if (uaddr == 0)
@@ -73,7 +80,10 @@
} else {
lc = SCHED_RR;
}
- error = lwp_create(&lwp0, &proc0, uaddr, inmem, LWP_DETACHED, NULL,
+ if ((flag & KTHREAD_JOINABLE) != 0) {
+ lwp_flags &= ~LWP_DETACHED;
+ }
+ error = lwp_create(&lwp0, &proc0, uaddr, inmem, lwp_flags, NULL,
0, func, arg, &l, lc);
if (error) {
uvm_uarea_free(uaddr, curcpu());
@@ -83,7 +93,7 @@
if (fmt != NULL) {
l->l_name = kmem_alloc(MAXCOMLEN, KM_SLEEP);
if (l->l_name == NULL) {
- lwp_exit(l);
+ kthread_destroy(l);
return ENOMEM;
}
va_start(ap, fmt);
@@ -98,6 +108,11 @@
KASSERT((flag & KTHREAD_MPSAFE) != 0);
}
+ /* Joinable kthread can't be NULL. */
+ if ((flag & KTHREAD_JOINABLE) != 0) {
+ KASSERT(l != NULL);
+ }
+
if (pri == PRI_NONE) {
if ((flag & KTHREAD_TS) != 0) {
/* Maximum user priority level. */
@@ -183,9 +198,39 @@
void
kthread_destroy(lwp_t *l)
{
-
+ proc_t *p;
+
KASSERT((l->l_flag & LW_SYSTEM) != 0);
KASSERT(l->l_stat == LSIDL);
+ p = l->l_proc;
+
+ /* Add LRP_DETACHED flag because we can have joinable kthread now. */
+ mutex_enter(p->p_lock);
+ l->l_prflag |= LPR_DETACHED;
+ mutex_exit(p->p_lock);
+
lwp_exit(l);
}
+
+/*
+ * Wait for a kthread to exit, as pthread_join().
+ */
+int
+kthread_join(lwp_t *l)
+{
+ lwpid_t departed;
+ proc_t *p;
+ int error;
+
+ KASSERT((l->l_flag & LW_SYSTEM) != 0);
+ KASSERT((l->l_prflag & LPR_DETACHED) == 0);
+
+ p = l->l_proc;
+
+ mutex_enter(p->p_lock);
+ error = lwp_wait1(curlwp, l->l_lid, &departed, LWPWAIT_EXITCONTROL);
+ mutex_exit(p->p_lock);
+
+ return error;
+}
Index: src/sys/sys/kthread.h
diff -u src/sys/sys/kthread.h:1.7.10.1 src/sys/sys/kthread.h:1.7.10.2
--- src/sys/sys/kthread.h:1.7.10.1 Mon Feb 2 22:01:34 2009
+++ src/sys/sys/kthread.h Tue Aug 9 16:18:23 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: kthread.h,v 1.7.10.1 2009/02/02 22:01:34 snj Exp $ */
+/* $NetBSD: kthread.h,v 1.7.10.2 2011/08/09 16:18:23 riz Exp $ */
/*-
* Copyright (c) 1998, 2007, 2009 The NetBSD Foundation, Inc.
@@ -44,6 +44,7 @@
#define KTHREAD_MPSAFE 0x02 /* does not need kernel_lock */
#define KTHREAD_INTR 0x04 /* interrupt handler */
#define KTHREAD_TS 0x08 /* timeshared */
+#define KTHREAD_JOINABLE 0x10 /* joinable thread */
int kthread_create(pri_t, int, struct cpu_info *,
void (*)(void *), void *,
@@ -51,6 +52,7 @@
__attribute__((__format__(__printf__,7,8)));
void kthread_exit(int) __dead;
void kthread_destroy(lwp_t *);
+int kthread_join(lwp_t *);
#endif /* _KERNEL */
#endif /* _SYS_KTHREAD_H_ */