On Thu, May 19, 2016 at 11:45 PM, David Turner <dturner@xxxxxxxxxxxxxxxx> wrote: > .gitignore | 1 + > Documentation/git-index-helper.txt | 50 ++++++ > Makefile | 5 + > cache.h | 11 ++ > contrib/completion/git-completion.bash | 1 + > git-compat-util.h | 1 + > index-helper.c | 280 +++++++++++++++++++++++++++++++++ > read-cache.c | 125 +++++++++++++-- > t/t7900-index-helper.sh | 23 +++ > 9 files changed, 488 insertions(+), 9 deletions(-) > create mode 100644 Documentation/git-index-helper.txt > create mode 100644 index-helper.c > create mode 100755 t/t7900-index-helper.sh We still need to classify this new command in command-list.txt. purehelpers probably the easiest choice. > +NOTES > +----- > + > +$GIT_DIR/index-helper.sock a Unix domain socket that the daemon reads > +commands from. The directory will also contain files named > +"shm-index-<SHA1>". These are used as backing stores for shared > +memory. Normally the daemon will clean up these files when it exits > +or when they are no longer relevant. But if it crashes, some objects > +could remain there and they can be safely deleted with "rm" > +command. The following commands are used to control the daemon: > + > +"refresh":: > + Reread the index. > + > +"poke": > + Let the daemon know the index is to be read. It keeps the > + daemon alive longer, unless `--exit-after=0` is used. > + > +All commands and replies are terminated by a NUL byte. I think it's "all commands are replies are in pkt-line format" now. > diff --git a/Makefile b/Makefile > index 2742a69..c8be0e7 100644 > --- a/Makefile > +++ b/Makefile > @@ -1433,6 +1433,10 @@ ifdef HAVE_DEV_TTY > BASIC_CFLAGS += -DHAVE_DEV_TTY > endif > > +ifndef NO_MMAP > + PROGRAM_OBJS += index-helper.o > +endif We need unix-socket.c too, which is only built when NO_UNIX_SOCKETS are not defined. We don't have any platform where mmap is supported but unix socket is not, do we? (a couple of minutes later, reading to read-cache.c..) well poke_daemon() calls unix_stream_connect() without any #ifdef, if NO_UNIX_SOCKETS is set, then it would lead to undefined reference error. > +static void set_socket_blocking_flag(int fd, int make_nonblocking) > +{ > + int flags; > + > + flags = fcntl(fd, F_GETFL, NULL); > + > + if (flags < 0) > + die(_("fcntl failed")); > + > + if (make_nonblocking) > + flags |= O_NONBLOCK; > + else > + flags &= ~O_NONBLOCK; > + > + if (fcntl(fd, F_SETFL, flags) < 0) > + die(_("fcntl failed")); > +} > ... > + client_fd = accept(fd, NULL, NULL); > + if (client_fd < 0) > + /* > + * An error here is unlikely -- it probably > + * indicates that the connecting process has > + * already dropped the connection. > + */ > + continue; > + > + /* > + * Our connection to the client is blocking since a client > + * can always be killed by SIGINT or similar. > + */ > + set_socket_blocking_flag(client_fd, 0); Out of curiosity, do we really need this? I thought default behavior was always blocking (and checked linux kernel, it seemed to agree with me). Maybe for extra safety because other OSes may default to something else? > +static int poke_daemon(struct index_state *istate, > + const struct stat *st, int refresh_cache) > +{ > + int fd; > + int ret = 0; > + const char *socket_path; > + > + /* if this is from index-helper, do not poke itself (recursively) */ > + if (istate->to_shm) > + return 0; > + > + socket_path = git_path("index-helper.sock"); > + if (!socket_path) > + return -1; This "if" is later removed. But you can remove it now if you re-roll, git_path() must not fail or we are screwed up long before this. -- Duy -- 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