Hi, David Laight wrote:
>Better to code as: > status = wmm->dwStatus; > if (...) Incidentally, that's what I did tonight in patch 20/25 try 2. >but even then I think the compiler is allowed to perform extra reads. >It might, for example, do so if the condition was complicayted and >there was a lot of pressure on registers - so instead of spilling 'status' >to stack, it would re-read it. Interesting. Do you think/believe or are you sure? >With gcc you can force it to only to one read by adding: > asm volatile("":::"memory"); >The only portable way is with volatile. "only portable way" from the C perspective. However, given a specific target environment, we could use its API functions. Either MemoryBarrier(); /* which MSDN documents but Wine does not provide in include/*.h Or InterlockedExchange(&status, wmm->dwStatus); So if AJ is still not satisfied with try 2, I'll change all reads of wmm->dwStatus within the player into InterlockedExchange. Yet I think that would be a superfluous extra memory barrier within the player. Thank you, Jörg Höhle