You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // RUN: %clang_tsan %s -o %t -framework Foundation | ||
|  | // RUN: %run %t 2>&1 | FileCheck %s | ||
|  | 
 | ||
|  | #import <Foundation/Foundation.h> | ||
|  | 
 | ||
|  | long my_global = 0; | ||
|  | 
 | ||
|  | int main(int argc, const char *argv[]) { | ||
|  |   fprintf(stderr, "Hello world.\n"); | ||
|  |    | ||
|  |   dispatch_queue_t queue = dispatch_queue_create("my.queue", DISPATCH_QUEUE_CONCURRENT); | ||
|  |   dispatch_semaphore_t sem = dispatch_semaphore_create(0); | ||
|  |   NSString *ns_path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"temp-gcd-io.%d", getpid()]]; | ||
|  |   const char *path = ns_path.fileSystemRepresentation; | ||
|  |   dispatch_io_t channel; | ||
|  |    | ||
|  |   dispatch_fd_t fd = open(path, O_CREAT | O_WRONLY, 0666); | ||
|  |   my_global++; | ||
|  |   channel = dispatch_io_create(DISPATCH_IO_STREAM, fd, queue, ^(int error) { | ||
|  |     my_global++; | ||
|  |     dispatch_semaphore_signal(sem); | ||
|  |   }); | ||
|  |   if (! channel) abort(); | ||
|  |   my_global++; | ||
|  |   dispatch_io_close(channel, 0); | ||
|  |   dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); | ||
|  |    | ||
|  |   my_global++; | ||
|  |   channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_CREAT | O_WRONLY, 0666, queue, ^(int error) { | ||
|  |     my_global++; | ||
|  |     dispatch_semaphore_signal(sem); | ||
|  |   }); | ||
|  |   if (! channel) abort(); | ||
|  |   my_global++; | ||
|  |   dispatch_io_close(channel, 0); | ||
|  |   dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); | ||
|  |    | ||
|  |   my_global++; | ||
|  |   dispatch_io_t other_channel = dispatch_io_create_with_path(DISPATCH_IO_STREAM, path, O_CREAT | O_WRONLY, 0666, queue, ^(int error) { }); | ||
|  |   channel = dispatch_io_create_with_io(DISPATCH_IO_STREAM, other_channel, queue, ^(int error) { | ||
|  |     my_global++; | ||
|  |     dispatch_semaphore_signal(sem); | ||
|  |   }); | ||
|  |   if (! channel) abort(); | ||
|  |   my_global++; | ||
|  |   dispatch_io_close(channel, 0); | ||
|  |   dispatch_io_close(other_channel, 0); | ||
|  |   dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); | ||
|  |    | ||
|  |   fprintf(stderr, "Done.\n"); | ||
|  |   return 0; | ||
|  | } | ||
|  | 
 | ||
|  | // CHECK: Hello world. | ||
|  | // CHECK-NOT: WARNING: ThreadSanitizer | ||
|  | // CHECK: Done. |