From 9fa52ad39c65486b982325ac7a1bc3c6ab672757 Mon Sep 17 00:00:00 2001 From: Stefan Karpinski Date: Fri, 13 Jul 2018 15:34:02 -0400 Subject: [PATCH] lazy LibGit2 initialization --- base/precompile.jl | 2 +- stdlib/LibGit2/src/LibGit2.jl | 8 ++++---- stdlib/LibGit2/src/error.jl | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/base/precompile.jl b/base/precompile.jl index 16f58b58ff85b..0ec63328ef4b8 100644 --- a/base/precompile.jl +++ b/base/precompile.jl @@ -465,7 +465,7 @@ precompile(Tuple{typeof(Core.Compiler.length), Tuple{typeof(Base.:(*)), Int64}}) precompile(Tuple{typeof(Core.Compiler.length), Tuple{typeof(Base.open_flags)}}) precompile(Tuple{typeof(Core.Compiler.vect), Type{typeof(typeassert)}}) precompile(Tuple{typeof(Distributed.terminate_all_workers)}) -precompile(Tuple{typeof(LibGit2.__init__)}) +precompile(Tuple{typeof(LibGit2.initialize)}) precompile(Tuple{typeof(Logging.__init__)}) precompile(Tuple{typeof(Logging.default_metafmt), Base.CoreLogging.LogLevel, Module, Symbol, Symbol, String, Int64}) precompile(Tuple{typeof(Logging.default_metafmt), Base.CoreLogging.LogLevel, Nothing, Symbol, Symbol, String, Int64}) diff --git a/stdlib/LibGit2/src/LibGit2.jl b/stdlib/LibGit2/src/LibGit2.jl index 55dde9a5a8203..08e35611376bc 100644 --- a/stdlib/LibGit2/src/LibGit2.jl +++ b/stdlib/LibGit2/src/LibGit2.jl @@ -16,7 +16,7 @@ export with, GitRepo, GitConfig const GITHUB_REGEX = r"^(?:git@|git://|https://(?:[\w\.\+\-]+@)?)github.com[:/](([^/].+)/(.+?))(?:\.git)?$"i -const REFCOUNT = Threads.Atomic{UInt}() +const REFCOUNT = Threads.Atomic{UInt}(0) include("utils.jl") include("consts.jl") @@ -972,12 +972,12 @@ function set_ssl_cert_locations(cert_loc) Cint(Consts.SET_SSL_CERT_LOCATIONS), cert_file, cert_dir) end -function __init__() - @check ccall((:git_libgit2_init, :libgit2), Cint, ()) +function initialize() REFCOUNT[] = 1 + @check ccall((:git_libgit2_init, :libgit2), Cint, ()) atexit() do - if Threads.atomic_sub!(REFCOUNT, UInt(1)) == 1 + if Threads.atomic_sub!(REFCOUNT, UInt(1)) >= 1 # refcount zero, no objects to be finalized ccall((:git_libgit2_shutdown, :libgit2), Cint, ()) end diff --git a/stdlib/LibGit2/src/error.jl b/stdlib/LibGit2/src/error.jl index b64e9f1b8d923..93e157fd14e2f 100644 --- a/stdlib/LibGit2/src/error.jl +++ b/stdlib/LibGit2/src/error.jl @@ -93,6 +93,7 @@ end # Error module macro check(git_func) quote + REFCOUNT[] == 0 && initialize() err = Cint($(esc(git_func::Expr))) if err < 0 throw(Error.GitError(err))