1. 10 Mar, 2023 1 commit
  2. 03 Mar, 2023 1 commit
    • xdiff: move xdiff to 'deps' · 462dbe21
      xdiff is a dependency (from git core) and more properly belongs in the
      'deps' directory. Move it there, and add a stub for cmake to resolve
      xdiff from the system location in the future. (At present, bundled xdiff
      remains hardcoded.)
      Edward Thomson committed
  3. 27 Feb, 2023 1 commit
  4. 08 Aug, 2022 1 commit
  5. 20 Jun, 2022 2 commits
  6. 23 Feb, 2022 5 commits
  7. 09 Feb, 2022 1 commit
    • rand: introduce git_rand PRNG · 3c53796c
      Introduce `git_rand`, a PRNG based on xoroshiro256**, a fast,
      all-purpose pseudo-random number generator: https://prng.di.unimi.it
      
      The PRNG will be seeded by the system's entropy store when possible,
      falling back to current time and system data (pid, uptime, etc).
      Inspiration for this was taken from libressl, but since our PRNG is
      not used for cryptographic purposes (and indeed currently only generates
      a unique temp file name that is written in a protected directory),
      this should be more than sufficient.
      
      Our implementation of xoroshiro256** was taken almost strictly from
      the original author's sources, but was tested against PractRand to
      ensure that there were no foolish mistranslations:
      
      ```
      RNG_test using PractRand version 0.94
      RNG = RNG_stdin64, seed = unknown
      test set = core, folding = standard (64 bit)
      
      rng=RNG_stdin64, seed=unknown
      length= 256 megabytes (2^28 bytes), time= 2.9 seconds
        no anomalies in 210 test result(s)
      
      rng=RNG_stdin64, seed=unknown
      length= 512 megabytes (2^29 bytes), time= 6.2 seconds
        no anomalies in 226 test result(s)
      
      rng=RNG_stdin64, seed=unknown
      length= 1 gigabyte (2^30 bytes), time= 12.7 seconds
        no anomalies in 243 test result(s)
      
      rng=RNG_stdin64, seed=unknown
      length= 2 gigabytes (2^31 bytes), time= 25.4 seconds
        no anomalies in 261 test result(s)
      
      rng=RNG_stdin64, seed=unknown
      length= 4 gigabytes (2^32 bytes), time= 50.6 seconds
        no anomalies in 277 test result(s)
      
      rng=RNG_stdin64, seed=unknown
      length= 8 gigabytes (2^33 bytes), time= 104 seconds
        no anomalies in 294 test result(s)
      ```
      Edward Thomson committed
  8. 30 Jan, 2022 2 commits
  9. 23 Dec, 2021 1 commit
    • cmake: use PROJECT_SOURCE_DIR of CMAKE_SOURCE_DIR · c5cd71b2
      Also applies to *_BINARY_DIR.
      
      This effectively reverts 84083dcc,
      which broke all users of libgit2 that use it as a CMake subdirectory
      (via `add_subdirectory()`). This is because CMAKE_SOURCE_DIR refers
      to the root-most CMake directory, which in the case of
      `add_subdirectory()` is a parent project to libgit2 and thus the paths
      don't make any sense to the configuration files. Corollary,
      CMAKE_SOURCE_DIR only makes sense if the CMake project is always the
      root project - which can rarely be guaranteed.
      
      In all honesty, CMake should deprecate and eventually remove
      CMAKE_SOURCE_DIR and CMAKE_BINARY_DIR. It's been the source of headaches
      and confusion for years, they're rarely useful over
      CMAKE_CURRENT_(SOURCE|BINARY)_DIR or PROJECT_(SOURCE|BINARY)_DIR,
      and they cause a lot of confusing configuration and source
      code layouts to boot.
      
      Any time they are used, they break `add_subdirectory()` almost 100% of
      the time, cause confusing error messages, and hide subtle bugs.
      Josh Junon committed
  10. 22 Nov, 2021 1 commit
  11. 14 Nov, 2021 2 commits
  12. 11 Nov, 2021 11 commits
  13. 18 Oct, 2021 2 commits
  14. 14 Sep, 2021 2 commits
  15. 17 Aug, 2021 1 commit
  16. 08 Aug, 2021 1 commit
  17. 30 Jul, 2021 1 commit
  18. 19 Jul, 2021 1 commit
    • alloc: add GIT_DEBUG_STRICT_ALLOC · 48e6b02b
      Add `GIT_DEBUG_STRICT_ALLOC` to help identify problematic callers of
      allocation code that pass a `0` size to the allocators and then expect a
      non-`NULL` return.
      
      When given a 0-size allocation, `malloc` _may_ return either a `NULL`
      _or_ a pointer that is not writeable.  Most systems return a non-`NULL`
      pointer; AIX is an outlier.  We should be able to cope with this AIXy
      behavior, so this adds an option to emulate it.
      Edward Thomson committed
  19. 04 Jan, 2021 1 commit
  20. 24 Dec, 2020 1 commit
    • zlib: Add support for building with Chromium's zlib implementation · 83265b3e
      This change builds libgit2 using Chromium's zlib implementation by
      invoking cmake with `-DUSE_BUNDLED_ZLIB=ON -DUSE_CHROMIUM_ZLIB=ON`,
      which is ~10% faster than the bundled zlib for the core::zstream suite.
      
      This version of zlib has some optimizations:
      
      a) Decompression (Intel+ARM): inflate_fast, adler32, crc32, etc.
      b) Compression (Intel): fill_window, longest_match, hash function, etc.
      
      Due to the introduction of SIMD optimizations, and to get the maximum
      performance out of this fork of zlib, this requires an x86_64 processor
      with SSE4.2 and CLMUL (anything Westmere or later, ~2010). The Chromium
      zlib implementation also supports ARM with NEON, but it has not been
      enabled in this patch.
      
      Performance
      ===========
      
      TL;DR: Running just `./libgit2_clar -score::zstream` 100 times in a loop
      took 0:56.30 before and 0:50.67 after (~10% reduction!).
      
      The bundled and system zlib implementations on an Ubuntu Focal system
      perform relatively similar (the bundled one is marginally better due to
      the compiler being able to inline some functions), so only the bundled
      and Chromium zlibs were compared.
      
      For a more balanced comparison (to ensure that nothing regressed
      overall), `libgit2_clar` under `perf` was also run, and the zlib-related
      functions were compared.
      
      Bundled
      -------
      
      ```shell
      cmake \
        -DUSE_BUNDLED_ZLIB=ON \
        -DUSE_CHROMIUM_ZLIB=OFF \
        -DCMAKE_BUILD_TYPE="RelWithDebInfo" \
        -DCMAKE_C_FLAGS="-fPIC -fno-omit-frame-pointer" \
        -GNinja \
        ..
      ninja
      perf record --call-graph=dwarf ./libgit2_clar
      perf report --children
      ```
      
      ```
      Samples: 87K of event 'cycles', Event count (approx.): 75923450603
        Children      Self  Command       Shared Objec  Symbol
      +    4.14%     0.01%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output_chunk
      +    2.91%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output
      +    0.69%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output (inlined)
           0.17%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_init
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_reset
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_eos
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_done
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_free (inlined)
      
      Samples: 87K of event 'cycles', Event count (approx.): 75923450603
        Children      Self  Command       Shared Objec  Symbol
      +    3.12%     0.01%  libgit2_clar  libgit2_clar  [.] deflate
      +    2.65%     1.48%  libgit2_clar  libgit2_clar  [.] deflate_slow
      +    1.60%     0.55%  libgit2_clar  libgit2_clar  [.] inflate
      +    0.53%     0.00%  libgit2_clar  libgit2_clar  [.] write_deflate
           0.49%     0.36%  libgit2_clar  libgit2_clar  [.] inflate_fast
           0.46%     0.02%  libgit2_clar  libgit2_clar  [.] deflate_fast
           0.19%     0.19%  libgit2_clar  libgit2_clar  [.] inflate_table
           0.16%     0.01%  libgit2_clar  libgit2_clar  [.] inflateInit_
           0.15%     0.00%  libgit2_clar  libgit2_clar  [.] inflateInit2_ (inlined)
           0.10%     0.00%  libgit2_clar  libgit2_clar  [.] deflateInit_
           0.10%     0.00%  libgit2_clar  libgit2_clar  [.] deflateInit2_
           0.03%     0.00%  libgit2_clar  libgit2_clar  [.] deflateReset (inlined)
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] deflateReset
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] inflateEnd
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] deflateEnd
           0.01%     0.00%  libgit2_clar  libgit2_clar  [.] deflateResetKeep
           0.01%     0.01%  libgit2_clar  libgit2_clar  [.] inflateReset2
           0.01%     0.00%  libgit2_clar  libgit2_clar  [.] deflateReset (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateReset (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] deflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateResetKeep (inlined)
      ```
      
      Chromium
      --------
      
      ```shell
      cmake \
        -DUSE_BUNDLED_ZLIB=ON \
        -DUSE_CHROMIUM_ZLIB=ON \
        -DCMAKE_BUILD_TYPE="RelWithDebInfo" \
        -DCMAKE_C_FLAGS="-fPIC -fno-omit-frame-pointer" \
        -GNinja \
        ..
      ninja
      perf record --call-graph=dwarf ./libgit2_clar
      perf report --children
      ```
      
      ```
      Samples: 97K of event 'cycles', Event count (approx.): 80862210917
        Children      Self  Command       Shared Objec  Symbol
      +    3.31%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output_chunk
      +    2.27%     0.01%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output
      +    0.55%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_get_output (inlined)
           0.18%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_init
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_reset
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_free (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_done
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] git_zstream_free
      
      Samples: 97K of event 'cycles', Event count (approx.): 80862210917
        Children      Self  Command       Shared Objec  Symbol
      +    2.55%     0.01%  libgit2_clar  libgit2_clar  [.] deflate
      +    2.25%     1.41%  libgit2_clar  libgit2_clar  [.] deflate_slow
      +    1.10%     0.52%  libgit2_clar  libgit2_clar  [.] inflate
           0.36%     0.00%  libgit2_clar  libgit2_clar  [.] write_deflate
           0.30%     0.03%  libgit2_clar  libgit2_clar  [.] deflate_fast
           0.28%     0.15%  libgit2_clar  libgit2_clar  [.] inflate_fast_chunk_
           0.19%     0.19%  libgit2_clar  libgit2_clar  [.] inflate_table
           0.17%     0.01%  libgit2_clar  libgit2_clar  [.] inflateInit_
           0.16%     0.00%  libgit2_clar  libgit2_clar  [.] inflateInit2_ (inlined)
           0.15%     0.00%  libgit2_clar  libgit2_clar  [.] deflateInit_
           0.15%     0.00%  libgit2_clar  libgit2_clar  [.] deflateInit2_
           0.11%     0.01%  libgit2_clar  libgit2_clar  [.] adler32_z
           0.09%     0.09%  libgit2_clar  libgit2_clar  [.] adler32_simd_
           0.05%     0.00%  libgit2_clar  libgit2_clar  [.] deflateReset (inlined)
           0.05%     0.00%  libgit2_clar  libgit2_clar  [.] deflate_read_buf
           0.03%     0.00%  libgit2_clar  libgit2_clar  [.] inflateEnd
           0.02%     0.00%  libgit2_clar  libgit2_clar  [.] deflateReset
           0.01%     0.00%  libgit2_clar  libgit2_clar  [.] deflateEnd
           0.01%     0.01%  libgit2_clar  libgit2_clar  [.] inflateReset2
           0.01%     0.00%  libgit2_clar  libgit2_clar  [.] inflateReset (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] adler32
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateResetKeep (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] deflateResetKeep
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] inflateStateCheck (inlined)
           0.00%     0.00%  libgit2_clar  libgit2_clar  [.] deflateStateCheck (inlined)
      ```
      lhchavez committed
  21. 12 Jul, 2020 1 commit