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>