grep: move sha1-reading mutex into low-level code
The multi-threaded git-grep code needs to serialize access to the thread-unsafe read_sha1_file call. It does this with a mutex that is local to builtin/grep.c. Let's instead push this down into grep.c, where it can be used by both builtin/grep.c and grep.c. This will let us safely teach the low-level grep.c code tricks that involve reading from the object db. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
78db6ea9dc
commit
b3aeb285d0
@ -85,21 +85,6 @@ static inline void grep_unlock(void)
|
|||||||
pthread_mutex_unlock(&grep_mutex);
|
pthread_mutex_unlock(&grep_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used to serialize calls to read_sha1_file. */
|
|
||||||
static pthread_mutex_t read_sha1_mutex;
|
|
||||||
|
|
||||||
static inline void read_sha1_lock(void)
|
|
||||||
{
|
|
||||||
if (use_threads)
|
|
||||||
pthread_mutex_lock(&read_sha1_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void read_sha1_unlock(void)
|
|
||||||
{
|
|
||||||
if (use_threads)
|
|
||||||
pthread_mutex_unlock(&read_sha1_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Signalled when a new work_item is added to todo. */
|
/* Signalled when a new work_item is added to todo. */
|
||||||
static pthread_cond_t cond_add;
|
static pthread_cond_t cond_add;
|
||||||
|
|
||||||
@ -254,7 +239,7 @@ static void start_threads(struct grep_opt *opt)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
pthread_mutex_init(&grep_mutex, NULL);
|
pthread_mutex_init(&grep_mutex, NULL);
|
||||||
pthread_mutex_init(&read_sha1_mutex, NULL);
|
pthread_mutex_init(&grep_read_mutex, NULL);
|
||||||
pthread_mutex_init(&grep_attr_mutex, NULL);
|
pthread_mutex_init(&grep_attr_mutex, NULL);
|
||||||
pthread_cond_init(&cond_add, NULL);
|
pthread_cond_init(&cond_add, NULL);
|
||||||
pthread_cond_init(&cond_write, NULL);
|
pthread_cond_init(&cond_write, NULL);
|
||||||
@ -303,7 +288,7 @@ static int wait_all(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_destroy(&grep_mutex);
|
pthread_mutex_destroy(&grep_mutex);
|
||||||
pthread_mutex_destroy(&read_sha1_mutex);
|
pthread_mutex_destroy(&grep_read_mutex);
|
||||||
pthread_mutex_destroy(&grep_attr_mutex);
|
pthread_mutex_destroy(&grep_attr_mutex);
|
||||||
pthread_cond_destroy(&cond_add);
|
pthread_cond_destroy(&cond_add);
|
||||||
pthread_cond_destroy(&cond_write);
|
pthread_cond_destroy(&cond_write);
|
||||||
@ -313,8 +298,6 @@ static int wait_all(void)
|
|||||||
return hit;
|
return hit;
|
||||||
}
|
}
|
||||||
#else /* !NO_PTHREADS */
|
#else /* !NO_PTHREADS */
|
||||||
#define read_sha1_lock()
|
|
||||||
#define read_sha1_unlock()
|
|
||||||
|
|
||||||
static int wait_all(void)
|
static int wait_all(void)
|
||||||
{
|
{
|
||||||
@ -376,9 +359,9 @@ static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type
|
|||||||
{
|
{
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
read_sha1_lock();
|
grep_read_lock();
|
||||||
data = read_sha1_file(sha1, type, size);
|
data = read_sha1_file(sha1, type, size);
|
||||||
read_sha1_unlock();
|
grep_read_unlock();
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -617,10 +600,10 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
|
|||||||
struct strbuf base;
|
struct strbuf base;
|
||||||
int hit, len;
|
int hit, len;
|
||||||
|
|
||||||
read_sha1_lock();
|
grep_read_lock();
|
||||||
data = read_object_with_reference(obj->sha1, tree_type,
|
data = read_object_with_reference(obj->sha1, tree_type,
|
||||||
&size, NULL);
|
&size, NULL);
|
||||||
read_sha1_unlock();
|
grep_read_unlock();
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
die(_("unable to read tree (%s)"), sha1_to_hex(obj->sha1));
|
die(_("unable to read tree (%s)"), sha1_to_hex(obj->sha1));
|
||||||
|
6
grep.c
6
grep.c
@ -826,6 +826,12 @@ static inline void grep_attr_unlock(void)
|
|||||||
if (grep_use_locks)
|
if (grep_use_locks)
|
||||||
pthread_mutex_unlock(&grep_attr_mutex);
|
pthread_mutex_unlock(&grep_attr_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Same as git_attr_mutex, but protecting the thread-unsafe object db access.
|
||||||
|
*/
|
||||||
|
pthread_mutex_t grep_read_mutex;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define grep_attr_lock()
|
#define grep_attr_lock()
|
||||||
#define grep_attr_unlock()
|
#define grep_attr_unlock()
|
||||||
|
17
grep.h
17
grep.h
@ -139,6 +139,23 @@ extern int grep_threads_ok(const struct grep_opt *opt);
|
|||||||
*/
|
*/
|
||||||
extern int grep_use_locks;
|
extern int grep_use_locks;
|
||||||
extern pthread_mutex_t grep_attr_mutex;
|
extern pthread_mutex_t grep_attr_mutex;
|
||||||
|
extern pthread_mutex_t grep_read_mutex;
|
||||||
|
|
||||||
|
static inline void grep_read_lock(void)
|
||||||
|
{
|
||||||
|
if (grep_use_locks)
|
||||||
|
pthread_mutex_lock(&grep_read_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void grep_read_unlock(void)
|
||||||
|
{
|
||||||
|
if (grep_use_locks)
|
||||||
|
pthread_mutex_unlock(&grep_read_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define grep_read_lock()
|
||||||
|
#define grep_read_unlock()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user