# Races ThreadSanitizer reports that are deliberate, so the leg stays green and
# a new report means a new bug. Delete an entry once its reader takes a load.
#
# Every entry names a READER, never the writer. Suppressing ftp_worker_release
# instead reads as one tidy line covering the same reports, but it also hides
# the release store going missing. With
# "race:ftp_worker_release" a build whose publish is a plain store passes this
# leg clean, and that is the regression the leg exists to catch. Naming the
# readers leaves back_ftp_handed_back and back_wait unsuppressed, and those are
# the two that act on the value, so the mutant still reds.
#
# lien_back.status and .r.size, which an FTP worker writes while the crawl loop
# polls them. Each of these readers is a predicate that answers the same for
# 1000 and 1001, or a statistic that only feeds the progress display, so the
# stale read costs nothing. #1809 says fixing the class properly needs a lock
# rather than a barrier.
#
# race_top, not race: race matches either stack at ANY frame, so it would hide
# a race on any field anywhere in the function or its callees. race_top matches
# the top frame only, which is the tightest the tool offers: TSan has no field
# or location suppression, and ANNOTATE_BENIGN_RACE_SIZED is reader-blind and so
# would whitelist back_wait too.
#
# This list is what the suite actually reaches, not every benign reader: 35
# functions in htsback.c hold 148 plain reads of .status or .r.size. back_available
# is the expected fifth, called unconditionally two lines from back_incache, so
# only scheduling separates them. back_abort_stopped and back_abort_limit read
# lnk[i].status plainly too, but only on a user stop or a --max-time or
# --max-size overrun, which this leg never sets. Check a new report against the
# predicate rule above before adding it here.
race_top:back_nsoc
race_top:back_transferred
race_top:slot_can_be_cleaned
race_top:back_incache
