PERFORCE change 61663 for review
Julian Elischer
julian at FreeBSD.org
Thu Sep 16 22:41:56 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=61663
Change 61663 by julian at julian_ref on 2004/09/17 05:41:18
create a separate thread_unthread() that we can call from places
where we are turning off threading so that we canbe sure we are doing
it properly.
Affected files ...
.. //depot/projects/nsched/sys/kern/kern_kse.c#28 edit
.. //depot/projects/nsched/sys/kern/kern_thr.c#18 edit
.. //depot/projects/nsched/sys/kern/kern_thread.c#37 edit
.. //depot/projects/nsched/sys/sys/proc.h#33 edit
Differences ...
==== //depot/projects/nsched/sys/kern/kern_kse.c#28 (text+ko) ====
@@ -346,8 +346,7 @@
* One possibility is to return to the user. It may not cope well.
* The other possibility would be to let the process exit.
*/
- p->p_flag &= ~(P_SA|P_HADTHREADS);
- sched_set_concurrency(td->td_ksegrp, 1);
+ thread_unthread(td);
mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
#if 1
==== //depot/projects/nsched/sys/kern/kern_thr.c#18 (text+ko) ====
==== //depot/projects/nsched/sys/kern/kern_thread.c#37 (text+ko) ====
@@ -709,6 +709,31 @@
}
/*
+ * Convert a process with one thread to an unthreaded process.
+ * Called from:
+ * thread_single(exit) (called from execve and exit)
+ * kse_exit() XXX may need cleaning up wrt KSE stuff
+ */
+void
+thread_unthread(struct thread *td)
+{
+ struct proc *p = td->td_proc;
+
+ KASSERT((p->p_numthreads == 1), ("Unthreading with >1 threads"));
+ upcall_remove(td);
+ p->p_flag &= ~(P_SA|P_HADTHREADS);
+ td->td_mailbox = NULL;
+ td->td_pflags &= ~(TDP_SA | TDP_CAN_UNBIND);
+ p->p_flag &= ~(P_STOPPED_SINGLE | P_SINGLE_EXIT); /* maybe not */
+ p->p_singlethread = NULL;
+ if (td->td_standin != NULL) {
+ thread_stash(td->td_standin);
+ td->td_standin = NULL;
+ }
+ sched_set_concurrency(td->td_ksegrp, 1);
+}
+
+/*
* Called from:
* thread_exit()
*/
@@ -835,21 +860,10 @@
* we try our utmost to revert to being a non-threaded
* process.
*/
- upcall_remove(td);
- p->p_flag &= ~(P_SA|P_HADTHREADS);
- td->td_mailbox = NULL;
- td->td_pflags &= ~(TDP_SA | TDP_CAN_UNBIND);
+ thread_unthread(td);
p->p_flag &= ~(P_STOPPED_SINGLE | P_SINGLE_EXIT);
- p->p_singlethread = NULL;
- if (td->td_standin != NULL) {
- thread_stash(td->td_standin);
- td->td_standin = NULL;
- }
- sched_set_concurrency(td->td_ksegrp, 1);
- mtx_unlock_spin(&sched_lock);
- } else {
- mtx_unlock_spin(&sched_lock);
}
+ mtx_unlock_spin(&sched_lock);
return (0);
}
==== //depot/projects/nsched/sys/sys/proc.h#33 (text+ko) ====
@@ -892,6 +892,7 @@
void thread_unlink(struct thread *td);
void thread_unsuspend(struct proc *p);
void thread_unsuspend_one(struct thread *td);
+void thread_unthread(struct thread *td);
int thread_userret(struct thread *td, struct trapframe *frame);
int thread_upcall_check(struct thread *td);
void thread_user_enter(struct thread *td);
More information about the p4-projects
mailing list