Skip to content

Commit 9146041

Browse files
kbleesdscho
authored andcommitted
mingw: add infrastructure for read-only file system level caches
Add a macro to mark code sections that only read from the file system, along with a config option and documentation. This facilitates implementation of relatively simple file system level caches without the need to synchronize with the file system. Enable read-only sections for 'git status' and preload_index. Signed-off-by: Karsten Blees <[email protected]>
1 parent 34fe2ac commit 9146041

File tree

6 files changed

+33
-0
lines changed

6 files changed

+33
-0
lines changed

Documentation/config/core.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,12 @@ relatively high IO latencies. When enabled, Git will do the
685685
index comparison to the filesystem data in parallel, allowing
686686
overlapping IO's. Defaults to true.
687687

688+
core.fscache::
689+
Enable additional caching of file system data for some operations.
690+
+
691+
Git for Windows uses this to bulk-read and cache lstat data of entire
692+
directories (instead of doing lstat file by file).
693+
688694
core.unsetenvvars::
689695
Windows-only: comma-separated list of environment variables'
690696
names that need to be unset before spawning any other process.

builtin/commit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,6 +1582,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
15821582
PATHSPEC_PREFER_FULL,
15831583
prefix, argv);
15841584

1585+
enable_fscache(1);
15851586
if (status_format != STATUS_FORMAT_PORCELAIN &&
15861587
status_format != STATUS_FORMAT_PORCELAIN_V2)
15871588
progress_flag = REFRESH_PROGRESS;

compat/mingw.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ enum hide_dotfiles_type {
244244
static int core_restrict_inherited_handles = -1;
245245
static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
246246
static char *unset_environment_variables;
247+
int core_fscache;
247248

248249
int mingw_core_config(const char *var, const char *value,
249250
const struct config_context *ctx, void *cb)
@@ -256,6 +257,11 @@ int mingw_core_config(const char *var, const char *value,
256257
return 0;
257258
}
258259

260+
if (!strcmp(var, "core.fscache")) {
261+
core_fscache = git_config_bool(var, value);
262+
return 0;
263+
}
264+
259265
if (!strcmp(var, "core.unsetenvvars")) {
260266
if (!value)
261267
return config_error_nonbool(var);

compat/mingw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ typedef _sigset_t sigset_t;
1111
#undef _POSIX_THREAD_SAFE_FUNCTIONS
1212
#endif
1313

14+
extern int core_fscache;
15+
1416
struct config_context;
1517
int mingw_core_config(const char *var, const char *value,
1618
const struct config_context *ctx, void *cb);

git-compat-util.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,21 @@ static inline int is_missing_file_error(int errno_)
15061506
return (errno_ == ENOENT || errno_ == ENOTDIR);
15071507
}
15081508

1509+
/*
1510+
* Enable/disable a read-only cache for file system data on platforms that
1511+
* support it.
1512+
*
1513+
* Implementing a live-cache is complicated and requires special platform
1514+
* support (inotify, ReadDirectoryChangesW...). enable_fscache shall be used
1515+
* to mark sections of git code that extensively read from the file system
1516+
* without modifying anything. Implementations can use this to cache e.g. stat
1517+
* data or even file content without the need to synchronize with the file
1518+
* system.
1519+
*/
1520+
#ifndef enable_fscache
1521+
#define enable_fscache(x) /* noop */
1522+
#endif
1523+
15091524
int cmd_main(int, const char **);
15101525

15111526
/*

preload-index.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ void preload_index(struct index_state *index,
132132
pthread_mutex_init(&pd.mutex, NULL);
133133
}
134134

135+
enable_fscache(1);
135136
for (i = 0; i < threads; i++) {
136137
struct thread_data *p = data+i;
137138
int err;
@@ -167,6 +168,8 @@ void preload_index(struct index_state *index,
167168

168169
trace2_data_intmax("index", NULL, "preload/sum_lstat", t2_sum_lstat);
169170
trace2_region_leave("index", "preload", NULL);
171+
172+
enable_fscache(0);
170173
}
171174

172175
int repo_read_index_preload(struct repository *repo,

0 commit comments

Comments
 (0)