PERFORCE change 65773 for review

David Xu davidxu at FreeBSD.org
Wed Nov 24 13:51:57 GMT 2004


http://perforce.freebsd.org/chv.cgi?CH=65773

Change 65773 by davidxu at davidxu_alona on 2004/11/24 13:50:55

	Add a mechanism to record which signal is for proc,
	but dispatched to the thread.

Affected files ...

.. //depot/projects/davidxu_thread/src/sys/kern/kern_sig.c#2 edit
.. //depot/projects/davidxu_thread/src/sys/sys/proc.h#2 edit

Differences ...

==== //depot/projects/davidxu_thread/src/sys/kern/kern_sig.c#2 (text+ko) ====

@@ -217,6 +217,7 @@
 	SIGSETNAND(set, td->td_sigmask);
 	SIGSETNAND(p->p_siglist, set);
 	SIGSETOR(td->td_siglist, set);
+	SIGSETOR(td->td_sigproc, set);
 
 	if (SIGPENDING(td)) {
 		mtx_lock_spin(&sched_lock);
@@ -623,6 +624,29 @@
 }
 
 /*
+ * Repost signals post to the proc but dispatched to the
+ * thread, it should only be called when thread is exiting.
+ */
+void
+sigrepost(struct thread *td)
+{
+	int i;
+	sigset_t set;
+
+	PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
+	set = td->td_siglist;
+	SIGSETAND(set, td->td_sigproc);
+	if (SIGNOTEMPTY(set)) {
+		for (i = 1; i <= _SIG_MAXSIG; ++i) {
+			if (SIGISMEMBER(set, i)) {
+				SIGDELSET(td->td_siglist, i);
+				psignal(td->td_proc, i);
+			}
+		}
+	}
+}
+
+/*
  * kern_sigprocmask()
  *
  *	Manipulate signal mask.
@@ -1503,6 +1527,7 @@
 	} else {
 		PROC_LOCK(p);
 	}
+	SIGDELSET(td->td_sigproc, sig);
 	ps = p->p_sigacts;
 	mtx_lock(&ps->ps_mtx);
 	if ((p->p_flag & P_TRACED) == 0 && SIGISMEMBER(ps->ps_sigcatch, sig) &&
@@ -1763,9 +1788,13 @@
 
 	SIGADDSET(*siglist, sig);
 	signotify(td);			/* uses schedlock */
-	if (siglist == &td->td_siglist && (td->td_waitset != NULL) &&
-	    action != SIG_HOLD) {
-		td->td_waitset = NULL;
+	if (siglist == &td->td_siglist) {
+		if (target == SIGTARGET_TD)
+			SIGDELSET(td->td_sigproc, sig);
+		else
+			SIGADDSET(td->td_sigproc, sig);
+ 		if ((td->td_waitset != NULL) && action != SIG_HOLD)
+			td->td_waitset = NULL;
 	}
 
 	/*
@@ -2117,7 +2146,6 @@
 			stopevent(p, S_SIG, sig);
 			mtx_lock(&ps->ps_mtx);
 		}
-
 		/*
 		 * We should see pending but ignored signals
 		 * only if P_TRACED was on when they were posted.
@@ -2142,6 +2170,7 @@
 			 * otherwise we just look for signals again.
 			 */
 			SIGDELSET(td->td_siglist, sig);	/* clear old signal */
+
 			if (td->td_pflags & TDP_SA)
 				SIGADDSET(td->td_sigmask, sig);
 			if (newsig == 0)
@@ -2160,6 +2189,7 @@
 			 * signal is being masked, look for other signals.
 			 */
 			SIGADDSET(td->td_siglist, sig);
+			SIGDELSET(td->td_sigproc, sig);
 			if (td->td_pflags & TDP_SA)
 				SIGDELSET(td->td_sigmask, sig);
 			if (SIGISMEMBER(td->td_sigmask, sig))

==== //depot/projects/davidxu_thread/src/sys/sys/proc.h#2 (text+ko) ====

@@ -281,6 +281,7 @@
 	sigset_t	td_oldsigmask;	/* (k) Saved mask from pre sigpause. */
 	sigset_t	td_sigmask;	/* (c) Current signal mask. */
 	sigset_t	td_siglist;	/* (c) Sigs arrived, not delivered. */
+	sigset_t	td_sigproc;	/* (c) Signals targets proc. */
 	sigset_t	*td_waitset;	/* (c) Wait set for sigwait. */
 	TAILQ_ENTRY(thread) td_umtx;	/* (c?) Link for when we're blocked. */
 	volatile u_int	td_generation;	/* (k) For detection of preemption */


More information about the p4-projects mailing list