From 2635b45d9035fc157c337b9c8e3300baaf135ebb Mon Sep 17 00:00:00 2001 From: lhchavez Date: Sun, 21 Jun 2020 06:44:06 -0700 Subject: [PATCH] Add a way to cleanly shut down the library (#578) This change adds the Shutdown() method, so that the library can be cleanly shut down. This helps significanly reduce the amount of noise in the leak detector. (cherry picked from commit 619a9c236bf79c63d955490c0803833004a47154) --- git.go | 10 ++++++++++ handles.go | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/git.go b/git.go index f953ebc..ff9b643 100644 --- a/git.go +++ b/git.go @@ -139,6 +139,16 @@ func init() { C.git_openssl_set_locking() } +// Shutdown frees all the resources acquired by libgit2. Make sure no +// references to any git2go objects are live before calling this. +// After this is called, invoking any function from this library will result in +// undefined behavior, so make sure this is called carefully. +func Shutdown() { + pointerHandles.Clear() + + C.git_libgit2_shutdown() +} + // Oid represents the id for a Git object. type Oid [20]byte diff --git a/handles.go b/handles.go index d27d3c3..c0d4b3c 100644 --- a/handles.go +++ b/handles.go @@ -43,6 +43,16 @@ func (v *HandleList) Untrack(handle unsafe.Pointer) { v.Unlock() } +// Clear stops tracking all the managed pointers. +func (v *HandleList) Clear() { + v.Lock() + for handle := range v.handles { + delete(v.handles, handle) + C.free(handle) + } + v.Unlock() +} + // Get retrieves the pointer from the given handle func (v *HandleList) Get(handle unsafe.Pointer) interface{} { v.RLock()