[compiler-rt] r314014 - Deflake the "xpc-race.mm" test.

Kuba Mracek via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 22 11:49:56 PDT 2017


Author: kuba.brecka
Date: Fri Sep 22 11:49:56 2017
New Revision: 314014

URL: http://llvm.org/viewvc/llvm-project?rev=314014&view=rev
Log:
Deflake the "xpc-race.mm" test.


Modified:
    compiler-rt/trunk/test/tsan/Darwin/xpc-race.mm

Modified: compiler-rt/trunk/test/tsan/Darwin/xpc-race.mm
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/Darwin/xpc-race.mm?rev=314014&r1=314013&r2=314014&view=diff
==============================================================================
--- compiler-rt/trunk/test/tsan/Darwin/xpc-race.mm (original)
+++ compiler-rt/trunk/test/tsan/Darwin/xpc-race.mm Fri Sep 22 11:49:56 2017
@@ -1,22 +1,26 @@
-// RUN: %clang_tsan %s -o %t -framework Foundation
+// RUN: %clangxx_tsan %s -o %t -framework Foundation
 // RUN: %deflake %run %t 2>&1 | FileCheck %s
 
 // UNSUPPORTED: ios
 
 #import <Foundation/Foundation.h>
 #import <xpc/xpc.h>
+#import <stdatomic.h>
 
 #import "../test.h"
 
 long global;
 
-long received_msgs;
+_Atomic(long) msg_counter;
+_Atomic(long) processed_msgs;
 xpc_connection_t server_conn;
 xpc_connection_t client_conns[2];
 
 int main(int argc, const char *argv[]) {
   @autoreleasepool {
-    NSLog(@"Hello world.");
+    fprintf(stderr, "Hello world.\n");
+    // CHECK: Hello world.
+
     barrier_init(&barrier, 2);
 
     dispatch_queue_t server_q = dispatch_queue_create("server.queue", DISPATCH_QUEUE_CONCURRENT);
@@ -24,21 +28,34 @@ int main(int argc, const char *argv[]) {
     server_conn = xpc_connection_create(NULL, server_q);
 
     xpc_connection_set_event_handler(server_conn, ^(xpc_object_t client) {
-      NSLog(@"server event handler, client = %@", client);
+      fprintf(stderr, "server event handler, client = %p\n", client);
 
       if (client == XPC_ERROR_CONNECTION_INTERRUPTED || client == XPC_ERROR_CONNECTION_INVALID) {
         return;
       }
       xpc_connection_set_event_handler(client, ^(xpc_object_t object) {
-        NSLog(@"received message: %@", object);
+        fprintf(stderr, "received message: %p\n", object);
 
-        barrier_wait(&barrier);
-        global = 42;
+        long msg_number = atomic_fetch_add_explicit(&msg_counter, 1, memory_order_relaxed);
 
-        dispatch_sync(dispatch_get_main_queue(), ^{
-          received_msgs++;
+        if (msg_number == 0)
+          barrier_wait(&barrier);
+
+        global++;
+        // CHECK: WARNING: ThreadSanitizer: data race
+        // CHECK:   Write of size 8
+        // CHECK:     #0 {{.*}}xpc-race.mm:[[@LINE-3]]
+        // CHECK:   Previous write of size 8
+        // CHECK:     #0 {{.*}}xpc-race.mm:[[@LINE-5]]
+        // CHECK: Location is global 'global'
+
+        if (msg_number == 1)
+          barrier_wait(&barrier);
 
-          if (received_msgs >= 2) {
+        atomic_fetch_add(&processed_msgs, 1);
+
+        dispatch_sync(dispatch_get_main_queue(), ^{
+          if (processed_msgs >= 2) {
             xpc_connection_cancel(client_conns[0]);
             xpc_connection_cancel(client_conns[1]);
             xpc_connection_cancel(server_conn);
@@ -55,12 +72,12 @@ int main(int argc, const char *argv[]) {
     for (int i = 0; i < 2; i++) {
       client_conns[i] = xpc_connection_create_from_endpoint(endpoint);
       xpc_connection_set_event_handler(client_conns[i], ^(xpc_object_t event) {
-        NSLog(@"client event handler, event = %@", event);
+        fprintf(stderr, "client event handler, event = %p\n", event);
       });
 
       xpc_object_t msg = xpc_dictionary_create(NULL, NULL, 0);
       xpc_dictionary_set_string(msg, "hello", "world");
-      NSLog(@"sending message: %@", msg);
+      fprintf(stderr, "sending message: %p\n", msg);
 
       xpc_connection_send_message(client_conns[i], msg);
       xpc_connection_resume(client_conns[i]);
@@ -68,16 +85,8 @@ int main(int argc, const char *argv[]) {
 
     CFRunLoopRun();
 
-    NSLog(@"Done.");
+    fprintf(stderr, "Done.\n");
+    // CHECK: Done.
   }
   return 0;
 }
-
-// CHECK: Hello world.
-// CHECK: WARNING: ThreadSanitizer: data race
-// CHECK:   Write of size 8
-// CHECK:     #0 {{.*}}xpc-race.mm:36
-// CHECK:   Previous write of size 8
-// CHECK:     #0 {{.*}}xpc-race.mm:36
-// CHECK: Location is global 'global'
-// CHECK: Done.




More information about the llvm-commits mailing list