# this file simulates a program that has been built with thread sanitizer
# options

message("TSAN_OPTIONS = [$ENV{TSAN_OPTIONS}]")
string(REGEX REPLACE ".*log_path=\"([^\"]*)\".*" "\\1" LOG_FILE "$ENV{TSAN_OPTIONS}")
message("LOG_FILE=[${LOG_FILE}]")

set(error_types
 "data race"
 "data race on vptr (ctor/dtor vs virtual call)"
 "heap-use-after-free"
 "thread leak"
 "destroy of a locked mutex"
  "double lock of a mutex"
  "unlock of an unlocked mutex (or by a wrong thread)"
  "read lock of a write locked mutex"
  "read unlock of a write locked mutex"
  "signal-unsafe call inside of a signal"
  "signal handler spoils errno"
  "lock-order-inversion (potential deadlock)"
 )

# clear the log file
file(REMOVE "${LOG_FILE}.2343")

# create an error of each type of thread santizer
# these names come from tsan_report.cc in llvm
foreach(error_type ${error_types} )

  file(APPEND "${LOG_FILE}.2343"
"==================
WARNING: ThreadSanitizer: ${error_type} (pid=27978)
  Write of size 4 at 0x7fe017ce906c by thread T1:
    #0 Thread1 ??:0 (exe+0x000000000bb0)
    #1 <null> <null>:0 (libtsan.so.0+0x00000001b279)

  Previous write of size 4 at 0x7fe017ce906c by main thread:
    #0 main ??:0 (exe+0x000000000c3c)

  Thread T1 (tid=27979, running) created by main thread at:
    #0 <null> <null>:0 (libtsan.so.0+0x00000001ed7b)
    #1 main ??:0 (exe+0x000000000c2c)

SUMMARY: ThreadSanitizer: ${error_type} ??:0 Thread1
==================
")
endforeach()
