1*bcb8190fSSaleem Abdulrasool// RUN: %clangxx_tsan %s -o %t -framework Foundation -std=c++11 274f7f399SKuba Brecka// RUN: %run %t 2>&1 | FileCheck %s 374f7f399SKuba Brecka 474f7f399SKuba Brecka#import <Foundation/Foundation.h> 574f7f399SKuba Brecka#import <libkern/OSAtomic.h> 674f7f399SKuba Brecka 774f7f399SKuba Brecka#include <thread> 874f7f399SKuba Brecka 974f7f399SKuba Brecka#include "../test.h" 1074f7f399SKuba Brecka 1174f7f399SKuba Breckatypedef struct { 1274f7f399SKuba Brecka void *next; 1374f7f399SKuba Brecka long data; 1474f7f399SKuba Brecka} ListItem; 1574f7f399SKuba Brecka 1674f7f399SKuba BreckaOSQueueHead q; 1774f7f399SKuba Brecka 1874f7f399SKuba Breckaint main(int argc, const char *argv[]) { 1974f7f399SKuba Brecka barrier_init(&barrier, 2); 2074f7f399SKuba Brecka 2174f7f399SKuba Brecka std::thread t1([] { 2274f7f399SKuba Brecka ListItem *li = new ListItem{nullptr, 42}; 2374f7f399SKuba Brecka OSAtomicEnqueue(&q, li, 0); 2474f7f399SKuba Brecka barrier_wait(&barrier); 2574f7f399SKuba Brecka }); 2674f7f399SKuba Brecka 2774f7f399SKuba Brecka std::thread t2([] { 2874f7f399SKuba Brecka barrier_wait(&barrier); 2974f7f399SKuba Brecka ListItem *li = (ListItem *)OSAtomicDequeue(&q, 0); 3074f7f399SKuba Brecka fprintf(stderr, "data = %ld\n", li->data); 3174f7f399SKuba Brecka }); 3274f7f399SKuba Brecka 3374f7f399SKuba Brecka t1.join(); 3474f7f399SKuba Brecka t2.join(); 3574f7f399SKuba Brecka 3674f7f399SKuba Brecka fprintf(stderr, "done\n"); 3774f7f399SKuba Brecka 3874f7f399SKuba Brecka return 0; 3974f7f399SKuba Brecka} 4074f7f399SKuba Brecka 4174f7f399SKuba Brecka// CHECK: data = 42 4274f7f399SKuba Brecka// CHECK: done 4374f7f399SKuba Brecka// CHECK-NOT: WARNING: ThreadSanitizer 44