Skip to content

Commit 747ab40

Browse files
kbleesGit for Windows Build Agent
authored andcommitted
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 5fbd208 commit 747ab40

File tree

6 files changed

+32
-0
lines changed

6 files changed

+32
-0
lines changed

Documentation/config.txt

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

763+
core.fscache::
764+
Enable additional caching of file system data for some operations.
765+
+
766+
Git for Windows uses this to bulk-read and cache lstat data of entire
767+
directories (instead of doing lstat file by file).
768+
763769
core.unsetenvvars::
764770
EXPERIMENTAL, Windows-only: comma-separated list of environment
765771
variables' names that need to be unset before spawning any other

builtin/commit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,6 +1379,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
13791379
PATHSPEC_PREFER_FULL,
13801380
prefix, argv);
13811381

1382+
enable_fscache(1);
13821383
read_cache_preload(&s.pathspec);
13831384
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
13841385

compat/mingw.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ enum hide_dotfiles_type {
211211

212212
static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
213213
static char *unset_environment_variables;
214+
int core_fscache;
214215

215216
int mingw_core_config(const char *var, const char *value)
216217
{
@@ -222,6 +223,11 @@ int mingw_core_config(const char *var, const char *value)
222223
return 0;
223224
}
224225

226+
if (!strcmp(var, "core.fscache")) {
227+
core_fscache = git_config_bool(var, value);
228+
return 0;
229+
}
230+
225231
if (!strcmp(var, "core.unsetenvvars")) {
226232
free(unset_environment_variables);
227233
unset_environment_variables = xstrdup(value);

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
extern int mingw_core_config(const char *var, const char *value);
1517
#define platform_core_config mingw_core_config
1618

git-compat-util.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,21 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
11091109
#define getc_unlocked(fh) getc(fh)
11101110
#endif
11111111

1112+
/*
1113+
* Enable/disable a read-only cache for file system data on platforms that
1114+
* support it.
1115+
*
1116+
* Implementing a live-cache is complicated and requires special platform
1117+
* support (inotify, ReadDirectoryChangesW...). enable_fscache shall be used
1118+
* to mark sections of git code that extensively read from the file system
1119+
* without modifying anything. Implementations can use this to cache e.g. stat
1120+
* data or even file content without the need to synchronize with the file
1121+
* system.
1122+
*/
1123+
#ifndef enable_fscache
1124+
#define enable_fscache(x) /* noop */
1125+
#endif
1126+
11121127
extern int cmd_main(int, const char **);
11131128

11141129
#endif

preload-index.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static void preload_index(struct index_state *index,
8484
offset = 0;
8585
work = DIV_ROUND_UP(index->cache_nr, threads);
8686
memset(&data, 0, sizeof(data));
87+
enable_fscache(1);
8788
for (i = 0; i < threads; i++) {
8889
struct thread_data *p = data+i;
8990
p->index = index;
@@ -100,6 +101,7 @@ static void preload_index(struct index_state *index,
100101
if (pthread_join(p->pthread, NULL))
101102
die("unable to join threaded lstat");
102103
}
104+
enable_fscache(0);
103105
}
104106
#endif
105107

0 commit comments

Comments
 (0)