Browse Source

Clean up pthread_create() error handling

Normally pthread_create() rarely fails. But with new pthreads wrapper,
pthread_create() will return ENOSYS on a system without thread support.

Threaded code _is_ protected by HAVE_THREADS and pthread_create()
should never run in the first place. But the situation could change in
the future and bugs may sneak in. Make sure that all pthread_create()
reports the error cause.

While at there, mark these strings for translation if they aren't.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nguyễn Thái Ngọc Duy 6 years ago committed by Junio C Hamano
parent
commit
2179045fd0
  1. 16
      name-hash.c
  2. 8
      preload-index.c
  3. 2
      run-command.c

16
name-hash.c

@ -494,6 +494,7 @@ static inline void lazy_update_dir_ref_counts(
static void threaded_lazy_init_name_hash( static void threaded_lazy_init_name_hash(
struct index_state *istate) struct index_state *istate)
{ {
int err;
int nr_each; int nr_each;
int k_start; int k_start;
int t; int t;
@ -526,8 +527,9 @@ static void threaded_lazy_init_name_hash(
if (k_start > istate->cache_nr) if (k_start > istate->cache_nr)
k_start = istate->cache_nr; k_start = istate->cache_nr;
td_dir_t->k_end = k_start; td_dir_t->k_end = k_start;
if (pthread_create(&td_dir_t->pthread, NULL, lazy_dir_thread_proc, td_dir_t)) err = pthread_create(&td_dir_t->pthread, NULL, lazy_dir_thread_proc, td_dir_t);
die("unable to create lazy_dir_thread"); if (err)
die(_("unable to create lazy_dir thread: %s"), strerror(err));
} }
for (t = 0; t < lazy_nr_dir_threads; t++) { for (t = 0; t < lazy_nr_dir_threads; t++) {
struct lazy_dir_thread_data *td_dir_t = td_dir + t; struct lazy_dir_thread_data *td_dir_t = td_dir + t;
@ -547,13 +549,15 @@ static void threaded_lazy_init_name_hash(
*/ */
td_name->istate = istate; td_name->istate = istate;
td_name->lazy_entries = lazy_entries; td_name->lazy_entries = lazy_entries;
if (pthread_create(&td_name->pthread, NULL, lazy_name_thread_proc, td_name)) err = pthread_create(&td_name->pthread, NULL, lazy_name_thread_proc, td_name);
die("unable to create lazy_name_thread"); if (err)
die(_("unable to create lazy_name thread: %s"), strerror(err));


lazy_update_dir_ref_counts(istate, lazy_entries); lazy_update_dir_ref_counts(istate, lazy_entries);


if (pthread_join(td_name->pthread, NULL)) err = pthread_join(td_name->pthread, NULL);
die("unable to join lazy_name_thread"); if (err)
die(_("unable to join lazy_name thread: %s"), strerror(err));


cleanup_dir_mutex(); cleanup_dir_mutex();



8
preload-index.c

@ -121,6 +121,8 @@ static void preload_index(struct index_state *index,


for (i = 0; i < threads; i++) { for (i = 0; i < threads; i++) {
struct thread_data *p = data+i; struct thread_data *p = data+i;
int err;

p->index = index; p->index = index;
if (pathspec) if (pathspec)
copy_pathspec(&p->pathspec, pathspec); copy_pathspec(&p->pathspec, pathspec);
@ -129,8 +131,10 @@ static void preload_index(struct index_state *index,
if (pd.progress) if (pd.progress)
p->progress = &pd; p->progress = &pd;
offset += work; offset += work;
if (pthread_create(&p->pthread, NULL, preload_thread, p)) err = pthread_create(&p->pthread, NULL, preload_thread, p);
die("unable to create threaded lstat");
if (err)
die(_("unable to create threaded lstat: %s"), strerror(err));
} }
for (i = 0; i < threads; i++) { for (i = 0; i < threads; i++) {
struct thread_data *p = data+i; struct thread_data *p = data+i;

2
run-command.c

@ -1213,7 +1213,7 @@ int start_async(struct async *async)
{ {
int err = pthread_create(&async->tid, NULL, run_thread, async); int err = pthread_create(&async->tid, NULL, run_thread, async);
if (err) { if (err) {
error_errno("cannot create thread"); error(_("cannot create async thread: %s"), strerror(err));
goto error; goto error;
} }
} }

Loading…
Cancel
Save