In preparation for further work on this, turn use_threads into a flag shared across the whole code base. The supporting (un)lock_if_threaded() functions are to be used for locking; they return immediately when not threading. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- builtin/grep.c | 20 ++++++++------------ thread-utils.c | 16 ++++++++++++++++ thread-utils.h | 16 ++++++++++++++++ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index 988ea1d..76f2c4f 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -24,8 +24,6 @@ NULL }; -static int use_threads = 1; - #ifndef NO_PTHREADS #define THREADS 8 static pthread_t threads[THREADS]; @@ -76,14 +74,12 @@ struct work_item { static inline void grep_lock(void) { - if (use_threads) - pthread_mutex_lock(&grep_mutex); + lock_if_threaded(&grep_mutex); } static inline void grep_unlock(void) { - if (use_threads) - pthread_mutex_unlock(&grep_mutex); + unlock_if_threaded(&grep_mutex); } /* Used to serialize calls to read_sha1_file. */ @@ -91,14 +87,12 @@ static inline void grep_unlock(void) static inline void read_sha1_lock(void) { - if (use_threads) - pthread_mutex_lock(&read_sha1_mutex); + lock_if_threaded(&read_sha1_mutex); } static inline void read_sha1_unlock(void) { - if (use_threads) - pthread_mutex_unlock(&read_sha1_mutex); + unlock_if_threaded(&read_sha1_mutex); } /* Signalled when a new work_item is added to todo. */ @@ -984,6 +978,10 @@ int cmd_grep(int argc, const char **argv, const char *prefix) argc--; } +#ifndef NO_PTHREADS + use_threads = 1; +#endif + if (show_in_pager == default_pager) show_in_pager = git_pager(1); if (show_in_pager) { @@ -1011,8 +1009,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix) skip_first_line = 1; start_threads(&opt); } -#else - use_threads = 0; #endif compile_grep_patterns(&opt); diff --git a/thread-utils.c b/thread-utils.c index 7f4b76a..fb75a29 100644 --- a/thread-utils.c +++ b/thread-utils.c @@ -1,6 +1,8 @@ #include "cache.h" #include "thread-utils.h" +int use_threads; + #if defined(hpux) || defined(__hpux) || defined(_hpux) # include <sys/pstat.h> #endif @@ -59,3 +61,17 @@ int init_recursive_mutex(pthread_mutex_t *m) } return ret; } + +#ifndef NO_PTHREADS +void lock_if_threaded(pthread_mutex_t *m) +{ + if (use_threads) + pthread_mutex_lock(m); +} + +void unlock_if_threaded(pthread_mutex_t *m) +{ + if (use_threads) + pthread_mutex_unlock(m); +} +#endif diff --git a/thread-utils.h b/thread-utils.h index 6fb98c3..9a780a2 100644 --- a/thread-utils.h +++ b/thread-utils.h @@ -1,11 +1,27 @@ #ifndef THREAD_COMPAT_H #define THREAD_COMPAT_H +/* + * This variable is used by commands to globally tell affected + * subsystems that they must use thread-safe mechanisms. + */ +extern int use_threads; + #ifndef NO_PTHREADS #include <pthread.h> extern int online_cpus(void); extern int init_recursive_mutex(pthread_mutex_t*); +/* These functions do nothing if use_threads==0 or NO_PTHREADS */ +extern void lock_if_threaded(pthread_mutex_t*); +extern void unlock_if_threaded(pthread_mutex_t*); + +#else + +#define lock_if_threaded(lock) +#define unlock_if_threaded(lock) + #endif + #endif /* THREAD_COMPAT_H */ -- 1.7.8.431.g2abf2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html