This moves the knote list to struct process for better process semantics 
with rthreads.  It should have little noticeable effect otherwise, but 
I've been wrong about simpler diffs before....


Index: sys/proc.h
===================================================================
RCS file: /home/tedu/cvs/src/sys/sys/proc.h,v
retrieving revision 1.126
diff -u -r1.126 proc.h
--- sys/proc.h  20 Apr 2010 22:05:44 -0000      1.126
+++ sys/proc.h  18 May 2010 01:04:06 -0000
@@ -146,6 +146,7 @@
        int     ps_refcnt;              /* Number of references. */
 
        u_int   ps_rdomain;             /* Process routing domain. */
+       struct  klist ps_klist;         /* knotes attached to this process */
 };
 #else
 struct process;
@@ -223,8 +224,6 @@
 
        void    *p_emuldata;            /* Per-process emulation data, or */
                                        /* NULL. Malloc type M_EMULDATA */
-       struct  klist p_klist;          /* knotes attached to this process */
-                                       /* pad to 256, avoid shifting eproc. */
 
        sigset_t p_sigdivert;           /* Signals to be diverted to thread. */
 
Index: kern/kern_event.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/kern/kern_event.c,v
retrieving revision 1.35
diff -u -r1.35 kern_event.c
--- kern/kern_event.c   9 Nov 2009 17:53:39 -0000       1.35
+++ kern/kern_event.c   18 May 2010 01:04:06 -0000
@@ -219,7 +219,7 @@
        }
 
        /* XXX lock the proc here while adding to the list? */
-       SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
+       SLIST_INSERT_HEAD(&p->p_p->ps_klist, kn, kn_selnext);
 
        return (0);
 }
@@ -241,7 +241,7 @@
                return;
 
        /* XXX locking?  this might modify another process. */
-       SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
+       SLIST_REMOVE(&p->p_p->ps_klist, kn, knote, kn_selnext);
 }
 
 int
Index: kern/kern_exec.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.111
diff -u -r1.111 kern_exec.c
--- kern/kern_exec.c    14 Jan 2010 23:12:11 -0000      1.111
+++ kern/kern_exec.c    18 May 2010 01:04:06 -0000
@@ -599,7 +599,7 @@
        /*
         * notify others that we exec'd
         */
-       KNOTE(&p->p_klist, NOTE_EXEC);
+       KNOTE(&p->p_p->ps_klist, NOTE_EXEC);
 
        /* setup new registers and do misc. setup. */
        if (pack.ep_emul->e_fixup != NULL) {
Index: kern/kern_exit.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.90
diff -u -r1.90 kern_exit.c
--- kern/kern_exit.c    24 Mar 2010 23:18:17 -0000      1.90
+++ kern/kern_exit.c    18 May 2010 01:04:06 -0000
@@ -292,7 +292,8 @@
        /*
         * notify interested parties of our demise.
         */
-       KNOTE(&p->p_klist, NOTE_EXIT);
+       if (p == p->p_p->ps_mainproc)
+               KNOTE(&p->p_p->ps_klist, NOTE_EXIT);
 
        /*
         * Notify parent that we're gone.  If we have P_NOZOMBIE or parent has
Index: kern/kern_fork.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.109
diff -u -r1.109 kern_fork.c
--- kern/kern_fork.c    24 Mar 2010 23:18:17 -0000      1.109
+++ kern/kern_fork.c    18 May 2010 01:04:47 -0000
@@ -156,7 +156,7 @@
 {
        struct process *pr, *parent;
 
-       pr = pool_get(&process_pool, PR_WAITOK);
+       pr = pool_get(&process_pool, PR_WAITOK | PR_ZERO);
        pr->ps_mainproc = newproc;
        TAILQ_INIT(&pr->ps_threads);
        TAILQ_INSERT_TAIL(&pr->ps_threads, newproc, p_thr_link);
@@ -460,7 +460,8 @@
        /*
         * Notify any interested parties about the new process.
         */
-       KNOTE(&p1->p_klist, NOTE_FORK | p2->p_pid);
+       if ((flags & FORK_THREAD) == 0)
+               KNOTE(&p1->p_p->ps_klist, NOTE_FORK | p2->p_pid);
 
        /*
         * Update stats now that we know the fork was successful.
Index: kern/kern_sig.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.107
diff -u -r1.107 kern_sig.c
--- kern/kern_sig.c     27 Nov 2009 19:43:55 -0000      1.107
+++ kern/kern_sig.c     18 May 2010 01:04:06 -0000
@@ -834,7 +834,7 @@
 #endif
 
        if (type != SPROPAGATED)
-               KNOTE(&p->p_klist, NOTE_SIGNAL | signum);
+               KNOTE(&p->p_p->ps_klist, NOTE_SIGNAL | signum);
 
        prop = sigprop[signum];
 
@@ -1654,7 +1654,7 @@
        kn->kn_flags |= EV_CLEAR;               /* automatically set */
 
        /* XXX lock the proc here while adding to the list? */
-       SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
+       SLIST_INSERT_HEAD(&p->p_p->ps_klist, kn, kn_selnext);
 
        return (0);
 }
@@ -1664,7 +1664,7 @@
 {
        struct proc *p = kn->kn_ptr.p_proc;
 
-       SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
+       SLIST_REMOVE(&p->p_p->ps_klist, kn, knote, kn_selnext);
 }
 
 /*

Reply via email to