]> Zhao Yanbai Git Server - minix.git/commitdiff
fixes r7363, r7356, r7352 from trunk
authorBen Gras <ben@minix3.org>
Fri, 18 Jun 2010 13:54:30 +0000 (13:54 +0000)
committerBen Gras <ben@minix3.org>
Fri, 18 Jun 2010 13:54:30 +0000 (13:54 +0000)
servers/pm/misc.c
servers/pm/mproc.h
servers/pm/signal.c
servers/vm/region.c

index 98420014839e3f504b92437d871650a35f396106..1fa22e3f83c6b1fbd9072a95a2847147eedea8a6 100644 (file)
@@ -79,6 +79,7 @@ PUBLIC int do_procstat()
   if (m_in.stat_nr == SELF) {
       mp->mp_reply.sig_set = mp->mp_sigpending;
       sigemptyset(&mp->mp_sigpending);
+      sigemptyset(&mp->mp_ksigpending);
   } 
   else {
       return(ENOSYS);
index 65cb183f79164f4365e2d8fd96b358f4b771b7a5..81525e18683bb4431e295ade2f4f2f5f0c3502a4 100644 (file)
@@ -41,6 +41,7 @@ EXTERN struct mproc {
   sigset_t mp_sigmask;         /* signals to be blocked */
   sigset_t mp_sigmask2;                /* saved copy of mp_sigmask */
   sigset_t mp_sigpending;      /* pending signals to be handled */
+  sigset_t mp_ksigpending;     /* bitmap for pending signals from the kernel */
   sigset_t mp_sigtrace;                /* signals to hand to tracer first */
   struct sigaction mp_sigact[_NSIG]; /* as in sigaction(2) */
   vir_bytes mp_sigreturn;      /* address of C library __sigreturn function */
index be287d631df32ab7f8169d413bb332e7a65edca5..9d054fab722a84ba8e95217c0d65a416921a4727 100644 (file)
@@ -67,6 +67,7 @@ PUBLIC int do_sigaction()
   if (svec.sa_handler == SIG_IGN) {
        sigaddset(&mp->mp_ignore, m_in.sig_nr);
        sigdelset(&mp->mp_sigpending, m_in.sig_nr);
+       sigdelset(&mp->mp_ksigpending, m_in.sig_nr);
        sigdelset(&mp->mp_catch, m_in.sig_nr);
   } else if (svec.sa_handler == SIG_DFL) {
        sigdelset(&mp->mp_ignore, m_in.sig_nr);
@@ -347,6 +348,7 @@ int ksig;                   /* non-zero means signal comes from kernel  */
 
   if (rmp->mp_flags & FS_CALL) {
        sigaddset(&rmp->mp_sigpending, signo);
+       if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
 
        if (!(rmp->mp_flags & PM_SIG_PENDING)) {
                /* No delay calls: FS_CALL implies the process called us. */
@@ -361,6 +363,11 @@ int ksig;                  /* non-zero means signal comes from kernel  */
 
   /* Handle system signals for system processes first. */
   if(rmp->mp_flags & PRIV_PROC) {
+       /* Always skip signals for PM (only necessary when broadcasting). */
+       if(rmp->mp_endpoint == PM_PROC_NR) {
+               return;
+       }
+
        /* System signals have always to go through the kernel first to let it
         * pick the right signal manager. If PM is the assigned signal manager,
         * the signal will come back and will actually be processed.
@@ -370,11 +377,6 @@ int ksig;                  /* non-zero means signal comes from kernel  */
                return;
        }
 
-       /* Always skip signals for PM (only necessary when broadcasting). */
-       if(rmp->mp_endpoint == PM_PROC_NR) {
-               return;
-       }
-
        /* Print stacktrace if necessary. */
        if(SIGS_IS_STACKTRACE(signo)) {
                sys_sysctl_stacktrace(rmp->mp_endpoint);
@@ -406,6 +408,7 @@ int ksig;                   /* non-zero means signal comes from kernel  */
   if (!badignore && sigismember(&rmp->mp_sigmask, signo)) {
        /* Signal should be blocked. */
        sigaddset(&rmp->mp_sigpending, signo);
+       if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
        return;
   }
 
@@ -415,6 +418,7 @@ int ksig;                   /* non-zero means signal comes from kernel  */
         * will be delivered using the check_pending() calls in do_trace().
         */
        sigaddset(&rmp->mp_sigpending, signo);
+       if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
        return;
   }
   if (!badignore && sigismember(&rmp->mp_catch, signo)) {
@@ -428,6 +432,7 @@ int ksig;                   /* non-zero means signal comes from kernel  */
                if (!(rmp->mp_flags & UNPAUSED)) {
                        /* not yet unpaused; continue later */
                        sigaddset(&rmp->mp_sigpending, signo);
+                       if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
 
                        return;
                }
@@ -564,12 +569,15 @@ register struct mproc *rmp;
    */
 
   int i;
+  int ksig;
 
   for (i = 1; i < _NSIG; i++) {
        if (sigismember(&rmp->mp_sigpending, i) &&
                !sigismember(&rmp->mp_sigmask, i)) {
+               ksig = sigismember(&rmp->mp_ksigpending, i);
                sigdelset(&rmp->mp_sigpending, i);
-               sig_proc(rmp, i, FALSE /*trace*/, FALSE /* ksig */);
+               sigdelset(&rmp->mp_ksigpending, i);
+               sig_proc(rmp, i, FALSE /*trace*/, ksig);
 
                if (rmp->mp_flags & FS_CALL)
                        break;
@@ -711,6 +719,7 @@ int signo;                  /* signal to send to process (1 to _NSIG-1) */
        rmp->mp_sigact[signo].sa_handler = SIG_DFL;
   }
   sigdelset(&rmp->mp_sigpending, signo);
+  sigdelset(&rmp->mp_ksigpending, signo);
 
   if(vm_push_sig(rmp->mp_endpoint, &cur_sp) != OK)
        return(FALSE);
index a4ac327ee334600f2dfb80038c9f786596ba1c4b..faf2bd08b91d6d8dda6b850de2f05cde8a5739a0 100644 (file)
@@ -559,21 +559,6 @@ PUBLIC void pb_unreferenced(struct vir_region *region, struct phys_region *pr)
                        panic("strange phys flags");
                }
                SLABFREE(pb);
-       } else {
-               struct phys_region *others;
-               int n = 0;
-
-               for(others = pb->firstregion; others;
-                       others = others->next_ph_list) {
-                       if(WRITABLE(region, others->ph)) {
-                               if(map_ph_writept(others->parent->parent,
-                                       others->parent, others) != OK) {
-                                       printf("VM: map_ph_writept failed unexpectedly\n");
-                               }
-                       } 
-                       n++;
-               }
-               assert(n == pb->refcount);
        }
 }