xref: /llvm-project/compiler-rt/test/tsan/Darwin/osatomics-list.mm (revision bcb8190f9947c0fb573dce679447bdb05b4e4ae3)
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