Alexandre Julliard : kernel32/tests: Use Interlocked functions to avoid fault counters being optimized out.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 21 11:21:10 CDT 2016


Module: wine
Branch: master
Commit: 2dd01087f26c79adf785f9fd302d713ea387acee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2dd01087f26c79adf785f9fd302d713ea387acee

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar 21 12:14:28 2016 +0900

kernel32/tests: Use Interlocked functions to avoid fault counters being optimized out.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/virtual.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index a3ae5e6..1a8fd6f 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1808,7 +1808,7 @@ static void test_write_watch(void)
 
 #ifdef __i386__
 
-static DWORD num_guard_page_calls;
+static LONG num_guard_page_calls;
 
 static DWORD guard_page_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
                                  CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
@@ -1820,7 +1820,7 @@ static DWORD guard_page_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_R
     ok( rec->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION, "ExceptionCode is %08x instead of %08x\n",
         rec->ExceptionCode, STATUS_GUARD_PAGE_VIOLATION );
 
-    num_guard_page_calls++;
+    InterlockedIncrement( &num_guard_page_calls );
     *(int *)rec->ExceptionInformation[1] += 0x100;
 
     return ExceptionContinueExecution;
@@ -1909,8 +1909,8 @@ static void test_guard_page(void)
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = 0;
-    old_value = *value; /* exception handler increments value by 0x100 */
+    InterlockedExchange( &num_guard_page_calls, 0 );
+    InterlockedExchange( &old_value, *value ); /* exception handler increments value by 0x100 */
     *value = 2;
     ok( old_value == 0x101, "memory block contains wrong value, expected 0x101, got 0x%x\n", old_value );
     ok( num_guard_page_calls == 1, "expected one callback of guard page handler, got %d calls\n", num_guard_page_calls );
@@ -1931,7 +1931,7 @@ static void test_guard_page(void)
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = 0;
+    InterlockedExchange( &num_guard_page_calls, 0 );
     old_value = *(value + 1);
     ok( old_value == 0x102, "memory block contains wrong value, expected 0x102, got 0x%x\n", old_value );
     ok( *value == 2, "memory block contains wrong value, expected 2, got 0x%x\n", *value );
@@ -1985,7 +1985,7 @@ static void test_guard_page(void)
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = 0;
+    InterlockedExchange( &num_guard_page_calls, 0 );
     *value       = 1;
     *(value + 1) = 2;
     ok( num_guard_page_calls == 1, "expected one callback of guard page handler, got %d calls\n", num_guard_page_calls );
@@ -2006,7 +2006,7 @@ static void test_guard_page(void)
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = 0;
+    InterlockedExchange( &num_guard_page_calls, 0 );
     old_value = *(value + 1); /* doesn't trigger write watch */
     ok( old_value == 0x102, "memory block contains wrong value, expected 0x102, got 0x%x\n", old_value );
     ok( *value == 1, "memory block contains wrong value, expected 1, got 0x%x\n", *value );
@@ -2132,7 +2132,7 @@ static void test_stack_commit(void)
     VirtualFree( call_on_stack, 0, MEM_RELEASE );
 }
 
-DWORD num_execute_fault_calls;
+static LONG num_execute_fault_calls;
 
 static DWORD execute_fault_seh_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
                                         CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
@@ -2157,7 +2157,7 @@ static DWORD execute_fault_seh_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTR
         ok( rec->ExceptionInformation[0] == err, "ExceptionInformation[0] is %d instead of %d\n",
             (DWORD)rec->ExceptionInformation[0], err );
 
-        num_guard_page_calls++;
+        InterlockedIncrement( &num_guard_page_calls );
     }
     else if (rec->ExceptionCode == STATUS_ACCESS_VIOLATION)
     {
@@ -2172,7 +2172,7 @@ static DWORD execute_fault_seh_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTR
         ok( success, "VirtualProtect failed %u\n", GetLastError() );
         ok( old_prot == PAGE_READWRITE, "wrong old prot %x\n", old_prot );
 
-        num_execute_fault_calls++;
+        InterlockedIncrement( &num_execute_fault_calls );
     }
 
     return ExceptionContinueExecution;
@@ -2193,7 +2193,7 @@ static LONG CALLBACK execute_fault_vec_handler( EXCEPTION_POINTERS *ExceptionInf
         "ExceptionCode is %08x instead of STATUS_ACCESS_VIOLATION\n", rec->ExceptionCode );
 
     if (rec->ExceptionCode == STATUS_ACCESS_VIOLATION)
-        num_execute_fault_calls++;
+        InterlockedIncrement( &num_execute_fault_calls );
 
     if (rec->ExceptionInformation[0] == EXCEPTION_READ_FAULT)
         return EXCEPTION_CONTINUE_SEARCH;
@@ -2214,7 +2214,8 @@ static inline DWORD send_message_excpt( HWND hWnd, UINT uMsg, WPARAM wParam, LPA
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = num_execute_fault_calls = 0;
+    InterlockedExchange( &num_guard_page_calls, 0 );
+    InterlockedExchange( &num_execute_fault_calls, 0 );
     ret = SendMessageA( hWnd, uMsg, wParam, lParam );
 
     pNtCurrentTeb()->Tib.ExceptionList = frame.Prev;
@@ -2231,7 +2232,8 @@ static inline DWORD call_proc_excpt( DWORD (CALLBACK *code)(void *), void *arg )
     frame.Prev = pNtCurrentTeb()->Tib.ExceptionList;
     pNtCurrentTeb()->Tib.ExceptionList = &frame;
 
-    num_guard_page_calls = num_execute_fault_calls = 0;
+    InterlockedExchange( &num_guard_page_calls, 0 );
+    InterlockedExchange( &num_execute_fault_calls, 0 );
     ret = code( arg );
 
     pNtCurrentTeb()->Tib.ExceptionList = frame.Prev;




More information about the wine-cvs mailing list