From: Torge Matthies tmatthies@codeweavers.com
--- dlls/ntdll/unix/server.c | 3 +++ dlls/ntdll/unix/virtual.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 51a83f472e1..362c7793cbc 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -602,6 +602,9 @@ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT sigset_t old_set; int signaled;
+ /* ensure writes so far are visible to other threads */ + MemoryBarrier(); + memset( &result, 0, sizeof(result) );
do diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 2b1581d767a..09fb8eaf4a6 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -5022,8 +5022,6 @@ void WINAPI NtFlushProcessWriteBuffers(void) { NTSTATUS status;
- MemoryBarrier(); - do { select_op_t select_op; @@ -5040,6 +5038,8 @@ void WINAPI NtFlushProcessWriteBuffers(void) TIMEOUT_INFINITE, NULL, NULL ); } while (status); + + /* server_select is a memory barrier, so no need to call MemoryBarrier() */ }