Export thread-safe version of 'has_symlink_leading_path()'
The threaded index preloading will want it, so that it can avoid locking by simply using a per-thread symlink/directory cache. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
867f72bf43
commit
b9fd284657
10
cache.h
10
cache.h
@ -744,7 +744,17 @@ struct checkout {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath);
|
extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath);
|
||||||
|
|
||||||
|
struct cache_def {
|
||||||
|
char path[PATH_MAX + 1];
|
||||||
|
int len;
|
||||||
|
int flags;
|
||||||
|
int track_flags;
|
||||||
|
int prefix_len_stat_func;
|
||||||
|
};
|
||||||
|
|
||||||
extern int has_symlink_leading_path(const char *name, int len);
|
extern int has_symlink_leading_path(const char *name, int len);
|
||||||
|
extern int threaded_has_symlink_leading_path(struct cache_def *, const char *, int);
|
||||||
extern int has_symlink_or_noent_leading_path(const char *name, int len);
|
extern int has_symlink_or_noent_leading_path(const char *name, int len);
|
||||||
extern int has_dirs_only_path(const char *name, int len, int prefix_len);
|
extern int has_dirs_only_path(const char *name, int len, int prefix_len);
|
||||||
extern void invalidate_lstat_cache(const char *name, int len);
|
extern void invalidate_lstat_cache(const char *name, int len);
|
||||||
|
21
symlinks.c
21
symlinks.c
@ -32,13 +32,7 @@ static int longest_path_match(const char *name_a, int len_a,
|
|||||||
return match_len;
|
return match_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cache_def {
|
static struct cache_def default_cache;
|
||||||
char path[PATH_MAX + 1];
|
|
||||||
int len;
|
|
||||||
int flags;
|
|
||||||
int track_flags;
|
|
||||||
int prefix_len_stat_func;
|
|
||||||
} default_cache;
|
|
||||||
|
|
||||||
static inline void reset_lstat_cache(struct cache_def *cache)
|
static inline void reset_lstat_cache(struct cache_def *cache)
|
||||||
{
|
{
|
||||||
@ -214,15 +208,20 @@ void clear_lstat_cache(void)
|
|||||||
|
|
||||||
#define USE_ONLY_LSTAT 0
|
#define USE_ONLY_LSTAT 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return non-zero if path 'name' has a leading symlink component
|
||||||
|
*/
|
||||||
|
int threaded_has_symlink_leading_path(struct cache_def *cache, const char *name, int len)
|
||||||
|
{
|
||||||
|
return lstat_cache(cache, name, len, FL_SYMLINK|FL_DIR, USE_ONLY_LSTAT) & FL_SYMLINK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return non-zero if path 'name' has a leading symlink component
|
* Return non-zero if path 'name' has a leading symlink component
|
||||||
*/
|
*/
|
||||||
int has_symlink_leading_path(const char *name, int len)
|
int has_symlink_leading_path(const char *name, int len)
|
||||||
{
|
{
|
||||||
struct cache_def *cache = &default_cache; /* FIXME */
|
return threaded_has_symlink_leading_path(&default_cache, name, len);
|
||||||
return lstat_cache(cache, name, len,
|
|
||||||
FL_SYMLINK|FL_DIR, USE_ONLY_LSTAT) &
|
|
||||||
FL_SYMLINK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user