From: Piotr Caban Subject: [PATCH 3/3] kernel32/tests: Test that memory changes are visible in copy-on-write mappings Message-Id: Date: Wed, 13 Feb 2019 11:25:57 +0100 This test introduces new failures on Mac OS. I'll resend it later together with changes to the implementation. --- dlls/kernel32/tests/virtual.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index a3d5e59e2b..1e5ea9ba85 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -4279,11 +4279,16 @@ static void test_mappings(void) test_mapping( INVALID_HANDLE_VALUE, SEC_COMMIT, FALSE ); } -static void test_shared_memory(BOOL is_child) +static void test_shared_memory(BOOL is_child, DWORD child_access) { - HANDLE mapping; + HANDLE mapping, mapping_created, mapping_modified; LONG *p; + mapping_created = CreateEventA(NULL, FALSE, FALSE, "virtual_mapping_created"); + ok(mapping_created != NULL, "CreateEvent failed with %u\n", GetLastError()); + mapping_modified = CreateEventA(NULL, FALSE, FALSE, "virtual_mapping_modified"); + ok(mapping_modified != NULL, "CreateEvent failed with %u\n", GetLastError()); + SetLastError(0xdeadbef); mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, "winetest_virtual.c"); ok(mapping != 0, "CreateFileMapping error %d\n", GetLastError()); @@ -4291,11 +4296,13 @@ static void test_shared_memory(BOOL is_child) ok(GetLastError() == ERROR_ALREADY_EXISTS, "expected ERROR_ALREADY_EXISTS, got %d\n", GetLastError()); SetLastError(0xdeadbef); - p = MapViewOfFile(mapping, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 4096); + p = MapViewOfFile(mapping, is_child ? child_access : FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 4096); ok(p != NULL, "MapViewOfFile error %d\n", GetLastError()); if (is_child) { + SetEvent(mapping_created); + WaitForSingleObject(mapping_modified, INFINITE); ok(*p == 0x1a2b3c4d, "expected 0x1a2b3c4d in child, got %#x\n", *p); } else @@ -4306,12 +4313,13 @@ static void test_shared_memory(BOOL is_child) STARTUPINFOA si = { sizeof(si) }; DWORD ret; - *p = 0x1a2b3c4d; - winetest_get_mainargs(&argv); - sprintf(cmdline, "\"%s\" virtual sharedmem", argv[0]); + sprintf(cmdline, "\"%s\" virtual sharedmem %x", argv[0], child_access); ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ok(ret, "CreateProcess(%s) error %d\n", cmdline, GetLastError()); + WaitForSingleObject(mapping_created, INFINITE); + *p = 0x1a2b3c4d; + SetEvent(mapping_modified); winetest_wait_child_process(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); @@ -4319,6 +4327,8 @@ static void test_shared_memory(BOOL is_child) UnmapViewOfFile(p); CloseHandle(mapping); + CloseHandle(mapping_created); + CloseHandle(mapping_modified); } static void test_shared_memory_ro(BOOL is_child, DWORD child_access) @@ -4381,7 +4391,7 @@ START_TEST(virtual) } if (!strcmp(argv[2], "sharedmem")) { - test_shared_memory(TRUE); + test_shared_memory(TRUE, strtol(argv[3], NULL, 16)); return; } if (!strcmp(argv[2], "sharedmemro")) @@ -4427,7 +4437,8 @@ START_TEST(virtual) GetSystemInfo(&si); trace("system page size %#x\n", si.dwPageSize); - test_shared_memory(FALSE); + test_shared_memory(FALSE, FILE_MAP_READ|FILE_MAP_WRITE); + test_shared_memory(FALSE, FILE_MAP_COPY); test_shared_memory_ro(FALSE, FILE_MAP_READ|FILE_MAP_WRITE); test_shared_memory_ro(FALSE, FILE_MAP_COPY); test_shared_memory_ro(FALSE, FILE_MAP_COPY|FILE_MAP_WRITE);