• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: %clang_tsan %s -o %t -framework Foundation
2// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s
3
4#import <Foundation/Foundation.h>
5
6long global;
7
8int main(int argc, const char *argv[]) {
9  fprintf(stderr, "Hello world.\n");
10
11  dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
12  dispatch_semaphore_t sem = dispatch_semaphore_create(0);
13
14  global = 44;
15  dispatch_data_t data = dispatch_data_create("buffer", 6, q, ^{
16    fprintf(stderr, "Data destructor.\n");
17    global++;
18
19    dispatch_semaphore_signal(sem);
20  });
21  dispatch_release(data);
22  data = nil;
23
24  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
25
26  data = dispatch_data_create("buffer", 6, q, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
27  dispatch_release(data);
28  data = nil;
29
30  fprintf(stderr, "Done.\n");
31}
32
33// CHECK: Hello world.
34// CHECK: Data destructor.
35// CHECK-NOT: WARNING: ThreadSanitizer
36// CHECK: Done.
37