brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 8c0ad8f Raw
58 lines · c
1// RUN: %clang_tsan %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'3 4#include <dispatch/dispatch.h>5 6#include <stdio.h>7#include <stdlib.h>8 9long my_global = 0;10 11int main(int argc, const char *argv[]) {12  fprintf(stderr, "Hello world.\n");13  14  dispatch_queue_t queue = dispatch_queue_create("my.queue", DISPATCH_QUEUE_CONCURRENT);15  dispatch_semaphore_t sem = dispatch_semaphore_create(0);16  const char *path = tempnam(NULL, "libdispatch-io-cleanup-");17  dispatch_io_t channel;18  19  dispatch_fd_t fd = open(path, O_CREAT | O_WRONLY, 0666);20  my_global++;21  channel = dispatch_io_create(DISPATCH_IO_STREAM, fd, queue, ^(int error) {22    my_global++;23    dispatch_semaphore_signal(sem);24  });25  if (! channel) abort();26  my_global++;27  dispatch_io_close(channel, 0);28  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);29  30  my_global++;31  channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_CREAT | O_WRONLY, 0666, queue, ^(int error) {32    my_global++;33    dispatch_semaphore_signal(sem);34  });35  if (! channel) abort();36  my_global++;37  dispatch_io_close(channel, 0);38  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);39  40  my_global++;41  dispatch_io_t other_channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_CREAT | O_WRONLY, 0666, queue, ^(int error) { });42  channel = dispatch_io_create_with_io(DISPATCH_IO_STREAM, other_channel, queue, ^(int error) {43    my_global++;44    dispatch_semaphore_signal(sem);45  });46  if (! channel) abort();47  my_global++;48  dispatch_io_close(channel, 0);49  dispatch_io_close(other_channel, 0);50  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);51  52  fprintf(stderr, "Done.\n");53  return 0;54}55 56// CHECK: Hello world.57// CHECK: Done.58