Merge branch 'jh/trace2'
authorJunio C Hamano <gitster@pobox.com>
Mon, 13 May 2019 14:50:35 +0000 (23:50 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 May 2019 14:50:35 +0000 (23:50 +0900)
A few embarrassing bugfixes.

* jh/trace2:
trace2: fix up a missing "leave" entry point
trace2: fix incorrect function pointer check

1  2 
read-cache.c
trace2.c
diff --combined read-cache.c
index 61b043bac3f2e26088177d13adc5ee5fe5e5c2e7,49329a1fb112df989cb69d6e95fd70a6f4392d21..4fad4e3f9ab004c85c0b2614b4d0637809d7e1b8
@@@ -17,7 -17,6 +17,7 @@@
  #include "commit.h"
  #include "blob.h"
  #include "resolve-undo.h"
 +#include "run-command.h"
  #include "strbuf.h"
  #include "varint.h"
  #include "split-index.h"
@@@ -589,19 -588,13 +589,19 @@@ int remove_index_entry_at(struct index_
   * CE_REMOVE is set in ce_flags.  This is much more effective than
   * calling remove_index_entry_at() for each entry to be removed.
   */
 -void remove_marked_cache_entries(struct index_state *istate)
 +void remove_marked_cache_entries(struct index_state *istate, int invalidate)
  {
        struct cache_entry **ce_array = istate->cache;
        unsigned int i, j;
  
        for (i = j = 0; i < istate->cache_nr; i++) {
                if (ce_array[i]->ce_flags & CE_REMOVE) {
 +                      if (invalidate) {
 +                              cache_tree_invalidate_path(istate,
 +                                                         ce_array[i]->name);
 +                              untracked_cache_remove_from_index(istate,
 +                                                                ce_array[i]->name);
 +                      }
                        remove_name_hash(istate, ce_array[i]);
                        save_or_free_index_entry(istate, ce_array[i]);
                }
@@@ -709,7 -702,6 +709,7 @@@ int add_to_index(struct index_state *is
        int add_option = (ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|
                          (intent_only ? ADD_CACHE_NEW_ONLY : 0));
        int hash_flags = HASH_WRITE_OBJECT;
 +      struct object_id oid;
  
        if (flags & ADD_CACHE_RENORMALIZE)
                hash_flags |= HASH_RENORMALIZE;
  
        namelen = strlen(path);
        if (S_ISDIR(st_mode)) {
 +              if (resolve_gitlink_ref(path, "HEAD", &oid) < 0)
 +                      return error(_("'%s' does not have a commit checked out"), path);
                while (namelen && path[namelen-1] == '/')
                        namelen--;
        }
@@@ -1644,24 -1634,39 +1644,24 @@@ struct ondisk_cache_entry 
        uint32_t uid;
        uint32_t gid;
        uint32_t size;
 -      unsigned char sha1[20];
 -      uint16_t flags;
 -      char name[FLEX_ARRAY]; /* more */
 -};
 -
 -/*
 - * This struct is used when CE_EXTENDED bit is 1
 - * The struct must match ondisk_cache_entry exactly from
 - * ctime till flags
 - */
 -struct ondisk_cache_entry_extended {
 -      struct cache_time ctime;
 -      struct cache_time mtime;
 -      uint32_t dev;
 -      uint32_t ino;
 -      uint32_t mode;
 -      uint32_t uid;
 -      uint32_t gid;
 -      uint32_t size;
 -      unsigned char sha1[20];
 -      uint16_t flags;
 -      uint16_t flags2;
 -      char name[FLEX_ARRAY]; /* more */
 +      /*
 +       * unsigned char hash[hashsz];
 +       * uint16_t flags;
 +       * if (flags & CE_EXTENDED)
 +       *      uint16_t flags2;
 +       */
 +      unsigned char data[GIT_MAX_RAWSZ + 2 * sizeof(uint16_t)];
 +      char name[FLEX_ARRAY];
  };
  
  /* These are only used for v3 or lower */
  #define align_padding_size(size, len) ((size + (len) + 8) & ~7) - (size + len)
 -#define align_flex_name(STRUCT,len) ((offsetof(struct STRUCT,name) + (len) + 8) & ~7)
 +#define align_flex_name(STRUCT,len) ((offsetof(struct STRUCT,data) + (len) + 8) & ~7)
  #define ondisk_cache_entry_size(len) align_flex_name(ondisk_cache_entry,len)
 -#define ondisk_cache_entry_extended_size(len) align_flex_name(ondisk_cache_entry_extended,len)
 -#define ondisk_ce_size(ce) (((ce)->ce_flags & CE_EXTENDED) ? \
 -                          ondisk_cache_entry_extended_size(ce_namelen(ce)) : \
 -                          ondisk_cache_entry_size(ce_namelen(ce)))
 +#define ondisk_data_size(flags, len) (the_hash_algo->rawsz + \
 +                                   ((flags & CE_EXTENDED) ? 2 : 1) * sizeof(uint16_t) + len)
 +#define ondisk_data_size_max(len) (ondisk_data_size(CE_EXTENDED, len))
 +#define ondisk_ce_size(ce) (ondisk_cache_entry_size(ondisk_data_size((ce)->ce_flags, ce_namelen(ce))))
  
  /* Allow fsck to force verification of the index checksum. */
  int verify_index_checksum;
@@@ -1735,8 -1740,6 +1735,8 @@@ static struct cache_entry *create_from_
        struct cache_entry *ce;
        size_t len;
        const char *name;
 +      const unsigned hashsz = the_hash_algo->rawsz;
 +      const uint16_t *flagsp = (const uint16_t *)(ondisk->data + hashsz);
        unsigned int flags;
        size_t copy_len = 0;
        /*
        int expand_name_field = version == 4;
  
        /* On-disk flags are just 16 bits */
 -      flags = get_be16(&ondisk->flags);
 +      flags = get_be16(flagsp);
        len = flags & CE_NAMEMASK;
  
        if (flags & CE_EXTENDED) {
 -              struct ondisk_cache_entry_extended *ondisk2;
                int extended_flags;
 -              ondisk2 = (struct ondisk_cache_entry_extended *)ondisk;
 -              extended_flags = get_be16(&ondisk2->flags2) << 16;
 +              extended_flags = get_be16(flagsp + 1) << 16;
                /* We do not yet understand any bit out of CE_EXTENDED_FLAGS */
                if (extended_flags & ~CE_EXTENDED_FLAGS)
                        die(_("unknown index entry format 0x%08x"), extended_flags);
                flags |= extended_flags;
 -              name = ondisk2->name;
 +              name = (const char *)(flagsp + 2);
        }
        else
 -              name = ondisk->name;
 +              name = (const char *)(flagsp + 1);
  
        if (expand_name_field) {
                const unsigned char *cp = (const unsigned char *)name;
        ce->ce_flags = flags & ~CE_NAMEMASK;
        ce->ce_namelen = len;
        ce->index = 0;
 -      hashcpy(ce->oid.hash, ondisk->sha1);
 +      hashcpy(ce->oid.hash, ondisk->data);
 +      memcpy(ce->name, name, len);
 +      ce->name[len] = '\0';
  
        if (expand_name_field) {
                if (copy_len)
@@@ -2547,8 -2550,6 +2547,8 @@@ static void copy_cache_entry_to_ondisk(
                                       struct cache_entry *ce)
  {
        short flags;
 +      const unsigned hashsz = the_hash_algo->rawsz;
 +      uint16_t *flagsp = (uint16_t *)(ondisk->data + hashsz);
  
        ondisk->ctime.sec = htonl(ce->ce_stat_data.sd_ctime.sec);
        ondisk->mtime.sec = htonl(ce->ce_stat_data.sd_mtime.sec);
        ondisk->uid  = htonl(ce->ce_stat_data.sd_uid);
        ondisk->gid  = htonl(ce->ce_stat_data.sd_gid);
        ondisk->size = htonl(ce->ce_stat_data.sd_size);
 -      hashcpy(ondisk->sha1, ce->oid.hash);
 +      hashcpy(ondisk->data, ce->oid.hash);
  
        flags = ce->ce_flags & ~CE_NAMEMASK;
        flags |= (ce_namelen(ce) >= CE_NAMEMASK ? CE_NAMEMASK : ce_namelen(ce));
 -      ondisk->flags = htons(flags);
 +      flagsp[0] = htons(flags);
        if (ce->ce_flags & CE_EXTENDED) {
 -              struct ondisk_cache_entry_extended *ondisk2;
 -              ondisk2 = (struct ondisk_cache_entry_extended *)ondisk;
 -              ondisk2->flags2 = htons((ce->ce_flags & CE_EXTENDED_FLAGS) >> 16);
 +              flagsp[1] = htons((ce->ce_flags & CE_EXTENDED_FLAGS) >> 16);
        }
  }
  
@@@ -2585,7 -2588,10 +2585,7 @@@ static int ce_write_entry(git_hash_ctx 
                stripped_name = 1;
        }
  
 -      if (ce->ce_flags & CE_EXTENDED)
 -              size = offsetof(struct ondisk_cache_entry_extended, name);
 -      else
 -              size = offsetof(struct ondisk_cache_entry, name);
 +      size = offsetof(struct ondisk_cache_entry,data) + ondisk_data_size(ce->ce_flags, 0);
  
        if (!previous_name) {
                int len = ce_namelen(ce);
@@@ -2743,7 -2749,7 +2743,7 @@@ static int do_write_index(struct index_
        struct cache_entry **cache = istate->cache;
        int entries = istate->cache_nr;
        struct stat st;
 -      struct ondisk_cache_entry_extended ondisk;
 +      struct ondisk_cache_entry ondisk;
        struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
        int drop_cache_tree = istate->drop_cache_tree;
        off_t offset;
                        return -1;
        }
  
 -      if (!strip_extensions && istate->split_index) {
 +      if (!strip_extensions && istate->split_index &&
 +          !is_null_oid(&istate->split_index->base_oid)) {
                struct strbuf sb = STRBUF_INIT;
  
                err = write_link_extension(&sb, istate) < 0 ||
@@@ -3037,17 -3042,8 +3037,17 @@@ static int do_write_locked_index(struc
        if (ret)
                return ret;
        if (flags & COMMIT_LOCK)
 -              return commit_locked_index(lock);
 -      return close_lock_file_gently(lock);
 +              ret = commit_locked_index(lock);
 +      else
 +              ret = close_lock_file_gently(lock);
 +
 +      run_hook_le(NULL, "post-index-change",
 +                      istate->updated_workdir ? "1" : "0",
 +                      istate->updated_skipworktree ? "1" : "0", NULL);
 +      istate->updated_workdir = 0;
 +      istate->updated_skipworktree = 0;
 +
 +      return ret;
  }
  
  static int write_split_index(struct index_state *istate,
@@@ -3131,7 -3127,7 +3131,7 @@@ static int write_shared_index(struct in
        trace2_region_enter_printf("index", "shared/do_write_index",
                                   the_repository, "%s", (*temp)->filename.buf);
        ret = do_write_index(si->base, *temp, 1);
-       trace2_region_enter_printf("index", "shared/do_write_index",
+       trace2_region_leave_printf("index", "shared/do_write_index",
                                   the_repository, "%s", (*temp)->filename.buf);
  
        if (ret)
@@@ -3242,7 -3238,7 +3242,7 @@@ int write_locked_index(struct index_sta
        ret = write_split_index(istate, lock, flags);
  
        /* Freshen the shared index only if the split-index was written */
 -      if (!ret && !new_shared_index) {
 +      if (!ret && !new_shared_index && !is_null_oid(&si->base_oid)) {
                const char *shared_index = git_path("sharedindex.%s",
                                                    oid_to_hex(&si->base_oid));
                freshen_shared_index(shared_index, 1);
diff --combined trace2.c
index eb759f326686c3e98e98102dee5c851f4efe9102,590e5542c54f70145913740ca6d508b401780841..c7b4f14d29a9d0ef38fba7595d15911757b9cbdb
+++ b/trace2.c
@@@ -10,7 -10,6 +10,7 @@@
  #include "trace2/tr2_cmd_name.h"
  #include "trace2/tr2_dst.h"
  #include "trace2/tr2_sid.h"
 +#include "trace2/tr2_sysenv.h"
  #include "trace2/tr2_tgt.h"
  #include "trace2/tr2_tls.h"
  
@@@ -121,7 -120,6 +121,7 @@@ static void tr2main_atexit_handler(void
        tr2_sid_release();
        tr2_cmd_name_release();
        tr2_cfg_free_patterns();
 +      tr2_sysenv_release();
  
        trace2_enabled = 0;
  }
@@@ -144,11 -142,6 +144,11 @@@ static void tr2main_signal_handler(int 
        raise(signo);
  }
  
 +void trace2_initialize_clock(void)
 +{
 +      tr2tls_start_process_clock();
 +}
 +
  void trace2_initialize_fl(const char *file, int line)
  {
        struct tr2_tgt *tgt_j;
        if (trace2_enabled)
                return;
  
 +      tr2_sysenv_load();
 +
        if (!tr2_tgt_want_builtins())
                return;
        trace2_enabled = 1;
@@@ -186,19 -177,13 +186,19 @@@ void trace2_cmd_start_fl(const char *fi
  {
        struct tr2_tgt *tgt_j;
        int j;
 +      uint64_t us_now;
 +      uint64_t us_elapsed_absolute;
  
        if (!trace2_enabled)
                return;
  
 +      us_now = getnanotime() / 1000;
 +      us_elapsed_absolute = tr2tls_absolute_elapsed(us_now);
 +
        for_each_wanted_builtin (j, tgt_j)
                if (tgt_j->pfn_start_fl)
 -                      tgt_j->pfn_start_fl(file, line, argv);
 +                      tgt_j->pfn_start_fl(file, line, us_elapsed_absolute,
 +                                          argv);
  }
  
  int trace2_cmd_exit_fl(const char *file, int line, int code)
        if (!trace2_enabled)
                return code;
  
 +      trace2_collect_process_info(TRACE2_PROCESS_INFO_EXIT);
 +
        tr2main_exit_code = code;
  
        us_now = getnanotime() / 1000;
@@@ -445,7 -428,7 +445,7 @@@ void trace2_thread_start_fl(const char 
        us_now = getnanotime() / 1000;
        us_elapsed_absolute = tr2tls_absolute_elapsed(us_now);
  
 -      tr2tls_create_self(thread_name);
 +      tr2tls_create_self(thread_name, us_now);
  
        for_each_wanted_builtin (j, tgt_j)
                if (tgt_j->pfn_thread_start_fl)
@@@ -565,14 -548,10 +565,14 @@@ void trace2_region_enter_printf_va_fl(c
  }
  
  void trace2_region_enter_fl(const char *file, int line, const char *category,
 -                          const char *label, const struct repository *repo)
 +                          const char *label, const struct repository *repo, ...)
  {
 +      va_list ap;
 +      va_start(ap, repo);
        trace2_region_enter_printf_va_fl(file, line, category, label, repo,
 -                                       NULL, NULL);
 +                                       NULL, ap);
 +      va_end(ap);
 +
  }
  
  void trace2_region_enter_printf_fl(const char *file, int line,
@@@ -642,13 -621,10 +642,13 @@@ void trace2_region_leave_printf_va_fl(c
  }
  
  void trace2_region_leave_fl(const char *file, int line, const char *category,
 -                          const char *label, const struct repository *repo)
 +                          const char *label, const struct repository *repo, ...)
  {
 +      va_list ap;
 +      va_start(ap, repo);
        trace2_region_leave_printf_va_fl(file, line, category, label, repo,
 -                                       NULL, NULL);
 +                                       NULL, ap);
 +      va_end(ap);
  }
  
  void trace2_region_leave_printf_fl(const char *file, int line,
@@@ -734,7 -710,7 +734,7 @@@ void trace2_data_json_fl(const char *fi
        us_elapsed_region = tr2tls_region_elasped_self(us_now);
  
        for_each_wanted_builtin (j, tgt_j)
-               if (tgt_j->pfn_data_fl)
+               if (tgt_j->pfn_data_json_fl)
                        tgt_j->pfn_data_json_fl(file, line, us_elapsed_absolute,
                                                us_elapsed_region, category,
                                                repo, key, value);