summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/klwp.h
diff options
context:
space:
mode:
authorcwb <none@none>2005-07-21 08:29:59 -0700
committercwb <none@none>2005-07-21 08:29:59 -0700
commit16ade92d9ce9c9ab33a25f7a2fdd00b581b6efda (patch)
tree1a878f0ece76b0bbe0842cc9d25e5ca6eb8e4997 /usr/src/uts/common/sys/klwp.h
parent80b8e1d8e1181e1da4f3eccd1df6261d543bf793 (diff)
downloadillumos-joyent-16ade92d9ce9c9ab33a25f7a2fdd00b581b6efda.tar.gz
4522909 automountd hangs with executable maps
Diffstat (limited to 'usr/src/uts/common/sys/klwp.h')
-rw-r--r--usr/src/uts/common/sys/klwp.h30
1 files changed, 26 insertions, 4 deletions
diff --git a/usr/src/uts/common/sys/klwp.h b/usr/src/uts/common/sys/klwp.h
index 53204efe04..ade26b4f82 100644
--- a/usr/src/uts/common/sys/klwp.h
+++ b/usr/src/uts/common/sys/klwp.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -161,12 +161,34 @@ typedef struct _klwp {
struct itimerval lwp_timer[3];
/*
- * used to stop/alert lwps
+ * There are a number of places where you do not wish an lwp to
+ * be stopped due to some interaction with other lwps in the process.
+ * In these cases the lwp_nostop value is incremented. At places where
+ * the lwp would normally be stopped the stop is allowed if lwp_nostop
+ * is zero. There are a very few cases where even if lwp_nostop is set
+ * we need to allow the lwp to stop. In those cases the lwp is
+ * stopped if lwp_nostop_r is not set regardless of the state of
+ * lwp_nostop. These conditions are:
+ *
+ * 1. In issig_forreal() when another lwp is undergoing fork1()
+ * or watchpoint activity (p_flag contains either SHOLDFORK1 or
+ * SHOLDWATCH or t_proc_flag contains TP_HOLDLWP)
+ *
+ * 2. In stop() when the why argument is not PR_SUSPENDED or the what
+ * argument is not SUSPEND_NORMAL.
+ *
+ * 3. In cv_wait_stop() when another lwp is undergoing fork1() or
+ * watchpoint activity (p_flag contains either SHOLDFORK1 or
+ * SHOLDWATCH or t_proc_flag contains TP_HOLDLWP)
+ *
+ * lwp_nostop_r is set in prstop(). ie we honour the presence of
+ * SHOLDFORK1 or SHOLDWATCH or TP_HOLDLWP in the case of
+ * stop(PR_SUSPENDED, SUSPEND_NORMAL)
*/
char lwp_unused;
char lwp_state; /* Running in User/Kernel mode (no lock req) */
- ushort_t lwp_nostop; /* Don't stop this lwp (no lock required) */
- kcondvar_t lwp_cv;
+ ushort_t lwp_nostop; /* Don't stop this lwp except SUSPEND_NORMAL */
+ ushort_t lwp_nostop_r; /* Don't stop this lwp (avoid recursion) */
/*
* Last failed privilege.