On Mon, 3 Mar 2025 10:51:30 +0100
Corinna Vinschen wrote:
> On Mar  1 08:33, Takashi Yano wrote:
> > The PID_STOPPED flag in _ponfo::process_state is sometimes accidentally
> > cleared due to a race condition when modifying it with the "|=" or "&="
> > operators. This patch uses InterlockedOr/And() instead to avoid the
> > race condition.
> 
> Is this really sufficent?  I'm asking because of...
> 
> > @@ -678,8 +678,9 @@ dofork (void **proc, bool *with_forkables)
> >  
> >    if (ischild)
> >      {
> > -      myself->process_state |= PID_ACTIVE;
> > -      myself->process_state &= ~(PID_INITIALIZING | PID_EXITED | 
> > PID_REAPED);
> > +      InterlockedOr ((LONG *) &myself->process_state, PID_ACTIVE);
> > +      InterlockedAnd ((LONG *) &myself->process_state,
> > +                 ~(PID_INITIALIZING | PID_EXITED | PID_REAPED));
> >      }
> >    else if (res < 0)
> >      {
> 
> ...places like these.  Every single Interlocked call is safe in itself,
> but what if somebody else changes something between the two interlocked
> calls?  Maybe this should be done with InterlockedCompareExchange.

Thanks for reviewing.

How can we guard that situation by using InterlockedCompareExchange()?
Could you please give me some more instruction?

-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

Reply via email to