>On Mon, 10 Jan 2000, Stephen McKay wrote:
>
>> The problem is that calcru() thinks that P_INMEM means that the proc
>> structure is fully and accurately populated.  But P_INMEM is one of the
>> first flags set.
>>
>> So, calcru() and possibly some other places, are looking at a struct proc
>> before it's all there.  What's the "proper" way to do it?
>
>It should really be one of the _last_ flags set, if it's to mean anything.
>I don't know how to explain the prevalance of race conditions in the old
>code, except to say it probably has to do with not planning ahead.
>Certainly it's not acceptable to create new race conditions now (even if
>it can happen by accident).
>
>So, here's something to defer P_INMEM til the end, when the process is
>really "ready":
>
>--- sys/kern/kern_fork.c       Tue Dec  7 22:11:35 1999
>+++ /tmp/kern_fork.c   Tue Jan 11 03:32:44 2000
>@@ -351,7 +351,7 @@
>        * Increase reference counts on shared objects.
>        * The p_stats and p_sigacts substructs are set in vm_fork.
>        */
>-      p2->p_flag = P_INMEM;
>+      p2->p_flag = 0;
>       if (p1->p_flag & P_PROFIL)
>               startprofclock(p2);
>       MALLOC(p2->p_cred, struct pcred *, sizeof(struct pcred),
>@@ -499,6 +499,7 @@
>       microtime(&(p2->p_stats->p_start));
>       p2->p_acflag = AFORK;
>       (void) splhigh();
>+      p2->p_flag |= P_INMEM;
>       p2->p_stat = SRUN;
>       setrunqueue(p2);
>       (void) spl0();

   It shouldn't be necessary to set the flag inside of splhigh. If you move
it up a line I think you'll have a winner.

-DG

David Greenman
Co-founder/Principal Architect, The FreeBSD Project - http://www.freebsd.org
Creator of high-performance Internet servers - http://www.terasolutions.com
Pave the road of life with opportunities.


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to