Git fork

Revert barrier-based LSan threading race workaround

The extra "barrier" approach was too much code whose sole purpose
was to work around a race that is not even ours (i.e. in LSan's
teardown code).

In preparation for queuing a solution taking a much-less-invasive
approach, let's revert them.

-39
-7
Makefile
··· 141 # 142 # Define NO_PTHREADS if you do not have or do not want to use Pthreads. 143 # 144 - # Define THREAD_BARRIER_PTHREAD if your system has pthread_barrier_t. Barrier 145 - # support is optional and is only helpful when building with SANITIZE=leak, as 146 - # it is used to eliminate some races in the leak-checker. 147 - # 148 # Define NO_PREAD if you have a problem with pread() system call (e.g. 149 # cygwin1.dll before v1.5.22). 150 # ··· 2083 else 2084 BASIC_CFLAGS += $(PTHREAD_CFLAGS) 2085 EXTLIBS += $(PTHREAD_LIBS) 2086 - ifdef THREAD_BARRIER_PTHREAD 2087 - BASIC_CFLAGS += -DTHREAD_BARRIER_PTHREAD 2088 - endif 2089 endif 2090 2091 ifdef HAVE_PATHS_H
··· 141 # 142 # Define NO_PTHREADS if you do not have or do not want to use Pthreads. 143 # 144 # Define NO_PREAD if you have a problem with pread() system call (e.g. 145 # cygwin1.dll before v1.5.22). 146 # ··· 2079 else 2080 BASIC_CFLAGS += $(PTHREAD_CFLAGS) 2081 EXTLIBS += $(PTHREAD_LIBS) 2082 endif 2083 2084 ifdef HAVE_PATHS_H
-8
builtin/grep.c
··· 101 /* Signalled when we are finished with everything. */ 102 static pthread_cond_t cond_result; 103 104 - /* Synchronize the start of all threads */ 105 - static maybe_thread_barrier_t start_barrier; 106 - 107 static int skip_first_line; 108 109 static void add_work(struct grep_opt *opt, struct grep_source *gs) ··· 201 int hit = 0; 202 struct grep_opt *opt = arg; 203 204 - maybe_thread_barrier_wait(&start_barrier); 205 - 206 while (1) { 207 struct work_item *w = get_work(); 208 if (!w) ··· 234 pthread_cond_init(&cond_add, NULL); 235 pthread_cond_init(&cond_write, NULL); 236 pthread_cond_init(&cond_result, NULL); 237 - maybe_thread_barrier_init(&start_barrier, NULL, num_threads + 1); 238 grep_use_locks = 1; 239 enable_obj_read_lock(); 240 ··· 254 die(_("grep: failed to create thread: %s"), 255 strerror(err)); 256 } 257 - maybe_thread_barrier_wait(&start_barrier); 258 } 259 260 static int wait_all(void) ··· 291 pthread_cond_destroy(&cond_add); 292 pthread_cond_destroy(&cond_write); 293 pthread_cond_destroy(&cond_result); 294 - maybe_thread_barrier_destroy(&start_barrier); 295 grep_use_locks = 0; 296 disable_obj_read_lock(); 297
··· 101 /* Signalled when we are finished with everything. */ 102 static pthread_cond_t cond_result; 103 104 static int skip_first_line; 105 106 static void add_work(struct grep_opt *opt, struct grep_source *gs) ··· 198 int hit = 0; 199 struct grep_opt *opt = arg; 200 201 while (1) { 202 struct work_item *w = get_work(); 203 if (!w) ··· 229 pthread_cond_init(&cond_add, NULL); 230 pthread_cond_init(&cond_write, NULL); 231 pthread_cond_init(&cond_result, NULL); 232 grep_use_locks = 1; 233 enable_obj_read_lock(); 234 ··· 248 die(_("grep: failed to create thread: %s"), 249 strerror(err)); 250 } 251 } 252 253 static int wait_all(void) ··· 284 pthread_cond_destroy(&cond_add); 285 pthread_cond_destroy(&cond_write); 286 pthread_cond_destroy(&cond_result); 287 grep_use_locks = 0; 288 disable_obj_read_lock(); 289
-6
builtin/index-pack.c
··· 185 186 static pthread_key_t key; 187 188 - static maybe_thread_barrier_t start_barrier; 189 - 190 static inline void lock_mutex(pthread_mutex_t *mutex) 191 { 192 if (threads_active) ··· 211 if (show_stat) 212 pthread_mutex_init(&deepest_delta_mutex, NULL); 213 pthread_key_create(&key, NULL); 214 - maybe_thread_barrier_init(&start_barrier, NULL, nr_threads); 215 CALLOC_ARRAY(thread_data, nr_threads); 216 for (i = 0; i < nr_threads; i++) { 217 thread_data[i].pack_fd = xopen(curr_pack, O_RDONLY); ··· 234 for (i = 0; i < nr_threads; i++) 235 close(thread_data[i].pack_fd); 236 pthread_key_delete(key); 237 - maybe_thread_barrier_destroy(&start_barrier); 238 free(thread_data); 239 } 240 ··· 1104 1105 static void *threaded_second_pass(void *data) 1106 { 1107 - if (threads_active) 1108 - maybe_thread_barrier_wait(&start_barrier); 1109 if (data) 1110 set_thread_data(data); 1111 for (;;) {
··· 185 186 static pthread_key_t key; 187 188 static inline void lock_mutex(pthread_mutex_t *mutex) 189 { 190 if (threads_active) ··· 209 if (show_stat) 210 pthread_mutex_init(&deepest_delta_mutex, NULL); 211 pthread_key_create(&key, NULL); 212 CALLOC_ARRAY(thread_data, nr_threads); 213 for (i = 0; i < nr_threads; i++) { 214 thread_data[i].pack_fd = xopen(curr_pack, O_RDONLY); ··· 231 for (i = 0; i < nr_threads; i++) 232 close(thread_data[i].pack_fd); 233 pthread_key_delete(key); 234 free(thread_data); 235 } 236 ··· 1100 1101 static void *threaded_second_pass(void *data) 1102 { 1103 if (data) 1104 set_thread_data(data); 1105 for (;;) {
-1
ci/lib.sh
··· 385 ;; 386 linux-leaks|linux-reftable-leaks) 387 export SANITIZE=leak 388 - export THREAD_BARRIER_PTHREAD=1 389 ;; 390 linux-asan-ubsan) 391 export SANITIZE=address,undefined
··· 385 ;; 386 linux-leaks|linux-reftable-leaks) 387 export SANITIZE=leak 388 ;; 389 linux-asan-ubsan) 390 export SANITIZE=address,undefined
-17
thread-utils.h
··· 53 int online_cpus(void); 54 int init_recursive_mutex(pthread_mutex_t*); 55 56 - #ifdef THREAD_BARRIER_PTHREAD 57 - #define maybe_thread_barrier_t pthread_barrier_t 58 - #define maybe_thread_barrier_init pthread_barrier_init 59 - #define maybe_thread_barrier_wait pthread_barrier_wait 60 - #define maybe_thread_barrier_destroy pthread_barrier_destroy 61 - #else 62 - #define maybe_thread_barrier_t int 63 - static inline int maybe_thread_barrier_init(maybe_thread_barrier_t *b UNUSED, 64 - void *attr UNUSED, 65 - unsigned nr UNUSED) 66 - { 67 - errno = ENOSYS; 68 - return -1; 69 - } 70 - #define maybe_thread_barrier_wait(barrier) 71 - #define maybe_thread_barrier_destroy(barrier) 72 - #endif 73 74 #endif /* THREAD_COMPAT_H */
··· 53 int online_cpus(void); 54 int init_recursive_mutex(pthread_mutex_t*); 55 56 57 #endif /* THREAD_COMPAT_H */