• Jeff Hostetler's avatar
    hashmap: add API to disable item counting when threaded · 8b604d19
    Jeff Hostetler authored
    This is to address concerns raised by ThreadSanitizer on the mailing list
    about threaded unprotected R/W access to map.size with my previous "disallow
    rehash" change (0607e100).
    
    See:
    https://public-inbox.org/git/adb37b70139fd1e2bac18bfd22c8b96683ae18eb.1502780344.git.martin.agren@gmail.com/
    
    Add API to hashmap to disable item counting and thus automatic rehashing.
    Also include API to later re-enable them.
    
    When item counting is disabled, the map.size field is invalid.  So to
    prevent accidents, the field has been renamed and an accessor function
    hashmap_get_size() has been added.  All direct references to this
    field have been been updated.  And the name of the field changed
    to map.private_size to communicate this.
    
    Here is the relevant output from ThreadSanitizer showing the problem:
    
    WARNING: ThreadSanitizer: data race (pid=10554)
      Read of size 4 at 0x00000082d488 by thread T2 (mutexes: write M16):
        #0 hashmap_add hashmap.c:209
        #1 hash_dir_entry_with_parent_and_prefix name-hash.c:302
        #2 handle_range_dir name-hash.c:347
        #3 handle_range_1 name-hash.c:415
        #4 lazy_dir_thread_proc name-hash.c:471
        #5 <null> <null>
    
      Previous write of size 4 at 0x00000082d488 by thread T1 (mutexes: write M31):
        #0 hashmap_add hashmap.c:209
        #1 hash_dir_entry_with_parent_and_prefix name-hash.c:302
        #2 handle_range_dir name-hash.c:347
        #3 handle_range_1 name-hash.c:415
        #4 handle_range_dir name-hash.c:380
        #5 handle_range_1 name-hash.c:415
        #6 lazy_dir_thread_proc name-hash.c:471
        #7 <null> <null>
    
    Martin gives instructions for running TSan on test t3008 in this post:
    https://public-inbox.org/git/CAN0heSoJDL9pWELD6ciLTmWf-a=oyxe4EXXOmCKvsG5MSuzxsA@mail.gmail.com/Signed-off-by: 's avatarJeff Hostetler <jeffhost@microsoft.com>
    Signed-off-by: 's avatarJunio C Hamano <gitster@pobox.com>
    8b604d19
hashmap.c 7.15 KB