On 12/08, Duy Nguyen wrote: > On Tue, Dec 6, 2016 at 3:16 AM, Brandon Williams <bmwill@xxxxxxxxxx> wrote: > > On 12/05, Stefan Beller wrote: > >> > static const char *real_path_internal(const char *path, int die_on_error) > >> > { > >> > - static struct strbuf sb = STRBUF_INIT; > >> > + static struct strbuf resolved = STRBUF_INIT; > >> > >> Also by having this static here, it is not quite thread safe, yet. > >> > >> By removing the static here we cannot do the early cheap check as: > >> > >> > /* We've already done it */ > >> > - if (path == sb.buf) > >> > + if (path == resolved.buf) > >> > return path; > >> > >> I wonder how often we run into this case; are there some callers explicitly > >> relying on real_path_internal being cheap for repeated calls? > >> (Maybe run the test suite with this early return instrumented? Not sure how > >> to assess the impact of removing the cheap out return optimization) > >> > >> The long tail (i.e. the actual functionality) should actually be > >> faster, I'd imagine > >> as we do less than with using chdir. > > > > Depends on how expensive the chdir calls were. And I'm working to get > > rid of the static buffer. Just need have the callers own the memory > > first. > > I suggest you turn this real_path_internal into strbuf_real_path. In > other words, it takes a strbuf and writes the result there, allocating > memory if needed. > > This function can replace the two strbuf_addstr(..., real_path(..)); > we have in setup.c and sha1_file.c. real_path() can own a static > strbuf buffer to retain current behavior. We could also have a new > wrapper real_pathdup() around strbuf_real_path(), which can replace 9 > instances of xstrdup(real_path(...)) (and Stefan is adding a few more; > that's what led me back to these mails) Sounds like a plan, thanks for the advice. -- Brandon Williams