diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a57f8b97..4098d0dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,6 +103,7 @@ jobs: echo "ASAN_DSO=$ASAN_DSO" >> $GITHUB_ENV echo "ASAN_OPTIONS=suppressions=${{ github.workspace }}/suppressions/asan.supp" >> $GITHUB_ENV echo "LSAN_OPTIONS=suppressions=${{ github.workspace }}/suppressions/lsan.supp" >> $GITHUB_ENV + echo "TSAN_OPTIONS=suppressions=${{ github.workspace }}/suppressions/tsan.supp" >> $GITHUB_ENV echo "UBSAN_OPTIONS=suppressions=${{ github.workspace }}/suppressions/ubsan.supp:print_stacktrace=1" >> $GITHUB_ENV echo "LD_LIBRARY_PATH=$LLVM_PREFIX/lib:`dirname $ASAN_DSO`" >> $GITHUB_ENV echo "$LLVM_PREFIX/bin" >> $GITHUB_PATH diff --git a/suppressions/tsan.supp b/suppressions/tsan.supp new file mode 100644 index 00000000..1a71eeb5 --- /dev/null +++ b/suppressions/tsan.supp @@ -0,0 +1,115 @@ +# an unlocked FALSE/TRUE assignment, which is fine +race:vips_region_prepare_to +race:render_kill +race:render_reschedule + +# an unlocked NULL assignment, which is fine +race:render_thread + +# unlocked read of pixels-processed-so-far, which is fine +race:vips_sink_base_progress +race:wbuffer_allocate_fn +race:sink_memory_area_allocate_fn + +# use of *stop from generate funcs is unlocked, but fine +race:vips_threadpool_run + +# guarded with vips_tracked_mutex, so it should be fine +race:vips_tracked_mem +race:vips_tracked_allocs +race:vips_tracked_files + +# guarded with task->allocate_lock, so it should be fine +race:vips_thread_allocate +race:vips_task_work_unit + +# guarded with vips_cache_lock, so it should be fine +race:vips_cache_table +race:vips_cache_drop_all +race:vips_cache_get_first +race:vips_cache_get_lru_cb +race:vips_cache_remove + +# guarded with vips__global_lock, so it should be fine +race:vips_error_freeze_count +race:vips__link_make +race:vips__link_map +race:vips__link_break_all +race:tile_name + +# the double-buffered output and write-behind thread are non-racy +race:wbuffer_new +race:wbuffer_write +race:wbuffer_work_fn +race:wbuffer_free +race:write_thread_state_new + +# thread-local variables (i.e. GPrivate) are harmless +race:vips_thread_profile_key +race:buffer_thread_key + +# glib signals are probably non-racy +race:vips_image_preeval +race:vips_image_eval +race:vips_image_posteval +race:vips_image_written +race:vips_image_real_written +race:vips_image_save_cb +race:render_close_cb +race:readjpeg_close_cb + +# semaphores are probably non-racy +race:vips_semaphore_* + +# guarded with sink->sslock, so it should be fine +race:sink_call_start +race:sink_call_stop +race:vips_hist_find_start +race:vips_hist_find_stop +race:vips_statistic_scan_start +race:vips_statistic_scan_stop +race:vips_max_stop +race:vips_values_add +race:vips_deviate_stop +race:vips_arithmetic_start +race:histogram_new + +# per-thread state allocate/dispose functions are non-racy +race:sink_thread_state_class_init +race:vips_thread_state_init +race:vips_thread_state_build +race:vips_thread_state_set +race:vips_thread_state_dispose +race:write_thread_state_new +race:vips_sink_base_init +race:vips_sink_thread_state_new +race:sink_memory_init +race:sink_memory_thread_state_new +race:sink_memory_free +race:sink_thread_state_build +race:sink_thread_state_dispose +race:buffer_cache_free +race:sink_init +race:sink_free +race:vips_sequential_dispose +race:vips_block_cache_dispose +race:vips_image_init +race:vips_image_build +race:vips_image_finalize +race:vips_image_dispose + +# guarded with image->sslock, so it should be fine +race:vips__region_start +race:vips__region_stop +race:vips_region_dispose +race:vips__region_take_ownership + +# is fine now, see: https://github.com/libvips/libvips/pull/1211 +race:vips_image_temp_name + +# is fine now, see: https://github.com/libvips/libvips/pull/1483 +race:meta_new +race:meta_cp +race:vips_image_set +race:vips__image_copy_fields_array +race:vips__image_meta_copy