brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 883154c Raw
61 lines · c
1// RUN: %clang_tsan %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'3 4#include <Availability.h>5#include <os/lock.h>6#include <pthread.h>7#include <stdio.h>8 9long global_variable;10os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;11char flags_available = 0;12 13void *Thread(void *a) {14  os_unfair_lock_lock(&lock);15  global_variable++;16  os_unfair_lock_unlock(&lock);17  return NULL;18}19 20void *ThreadWithFlags(void *a) {21#if defined(__MAC_15_0) || defined(__IPHONE_18_0) || defined(__TVOS_18_0) ||   \22    defined(__VISIONOS_2_0) || defined(__WATCHOS_11_0)23#  pragma clang diagnostic push24#  pragma clang diagnostic ignored "-Wunguarded-availability-new"25  if (os_unfair_lock_lock_with_flags) {26    os_unfair_lock_lock_with_flags(&lock, OS_UNFAIR_LOCK_FLAG_ADAPTIVE_SPIN);27    flags_available = 1;28  } else {29    os_unfair_lock_lock(&lock);30  }31#  pragma clang diagnostic pop32#else33  os_unfair_lock_lock(&lock);34#endif35  global_variable++;36  os_unfair_lock_unlock(&lock);37  return NULL;38}39 40int main() {41  pthread_t t1, t2;42  global_variable = 0;43  pthread_create(&t1, NULL, Thread, NULL);44  pthread_create(&t2, NULL, Thread, NULL);45  pthread_join(t1, NULL);46  pthread_join(t2, NULL);47  fprintf(stderr, "global_variable = %ld\n", global_variable);48 49  // CHECK: global_variable = 250 51  pthread_create(&t1, NULL, ThreadWithFlags, NULL);52  pthread_create(&t2, NULL, ThreadWithFlags, NULL);53  pthread_join(t1, NULL);54  pthread_join(t2, NULL);55  fprintf(stderr,56          "global_variable = %ld, os_unfair_lock_lock_with_flags %savailable\n",57          global_variable, flags_available ? "" : "un");58}59 60// CHECK: global_variable = 461