brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · eeededd Raw
119 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 9dispatch_queue_t queue;10dispatch_data_t data;11dispatch_semaphore_t sem;12const char *path;13 14long my_global = 0;15 16void test_dispatch_io_write() {17  dispatch_io_t channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_CREAT | O_WRONLY, 0666, queue, ^(int error) { });18  if (! channel) abort();19  dispatch_io_set_high_water(channel, 1);20  21  my_global++;22  dispatch_io_write(channel, 0, data, queue, ^(bool done, dispatch_data_t remainingData, int error) {23    if (error) abort();24    my_global++;25    dispatch_async(queue, ^{26      my_global++;27      if (done) {28        dispatch_semaphore_signal(sem);29      }30    });31  });32  33  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);34  my_global++;35  dispatch_io_close(channel, 0);36}37 38void test_dispatch_write() {39  dispatch_fd_t fd = open(path, O_CREAT | O_WRONLY, 0666);40  if (fd == -1) abort();41  42  my_global++;43  dispatch_write(fd, data, queue, ^(dispatch_data_t data, int error) {44    if (error) abort();45    my_global++;46    dispatch_async(queue, ^{47      my_global++;48      49      dispatch_semaphore_signal(sem);50    });51  });52  53  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);54  my_global++;55  close(fd);56}57 58void test_dispatch_io_read() {59  dispatch_io_t channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_RDONLY,60                       0, queue, ^(int error) { });61  dispatch_io_set_high_water(channel, 1);62  63  my_global++;64  dispatch_io_read(channel, 0, SIZE_MAX, queue, ^(bool done, dispatch_data_t remainingData, int error) {65    if (error) abort();66    my_global++;67    dispatch_async(queue, ^{68      my_global++;69      if (done) {70        dispatch_semaphore_signal(sem);71      }72    });73  });74  75  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);76  my_global++;77  dispatch_io_close(channel, 0);78}79 80void test_dispatch_read() {81  dispatch_fd_t fd = open(path, O_RDONLY, 0);82  if (fd == -1) abort();83  84  my_global++;85  dispatch_read(fd, SIZE_MAX, queue, ^(dispatch_data_t data, int error) {86    if (error) abort();87    my_global++;88    dispatch_async(queue, ^{89      my_global++;90      dispatch_semaphore_signal(sem);91    });92  });93  94  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);95  my_global++;96  close(fd);97}98 99int main(int argc, const char *argv[]) {100  fprintf(stderr, "Hello world.\n");101  102  queue = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);103  sem = dispatch_semaphore_create(0);104  path = tempnam(NULL, "libdispatch-io-");105  char buf[1000];106  data = dispatch_data_create(buf, sizeof(buf), NULL, DISPATCH_DATA_DESTRUCTOR_DEFAULT);107  108  test_dispatch_io_write();109  test_dispatch_write();110  test_dispatch_io_read();111  test_dispatch_read();112  113  fprintf(stderr, "Done.\n");114  return 0;115}116 117// CHECK: Hello world.118// CHECK: Done.119