Unverified Commit b661e9aa by Edward Thomson Committed by GitHub

Merge pull request #5578 from libgit2/ethomson/friendlier_getting_started

Friendlier getting started in the lack of git_libgit2_init
parents a5cb2cc9 08f28ff5
...@@ -8,10 +8,22 @@ ...@@ -8,10 +8,22 @@
#include "alloc.h" #include "alloc.h"
#include "runtime.h" #include "runtime.h"
#include "allocators/failalloc.h"
#include "allocators/stdalloc.h" #include "allocators/stdalloc.h"
#include "allocators/win32_leakcheck.h" #include "allocators/win32_leakcheck.h"
git_allocator git__allocator; /* Fail any allocation until git_libgit2_init is called. */
git_allocator git__allocator = {
git_failalloc_malloc,
git_failalloc_calloc,
git_failalloc_strdup,
git_failalloc_strndup,
git_failalloc_substrdup,
git_failalloc_realloc,
git_failalloc_reallocarray,
git_failalloc_mallocarray,
git_failalloc_free
};
static int setup_default_allocator(void) static int setup_default_allocator(void)
{ {
...@@ -25,10 +37,10 @@ static int setup_default_allocator(void) ...@@ -25,10 +37,10 @@ static int setup_default_allocator(void)
int git_allocator_global_init(void) int git_allocator_global_init(void)
{ {
/* /*
* We don't want to overwrite any allocator which has been set before * We don't want to overwrite any allocator which has been set
* the init function is called. * before the init function is called.
*/ */
if (git__allocator.gmalloc != NULL) if (git__allocator.gmalloc != git_failalloc_malloc)
return 0; return 0;
return setup_default_allocator(); return setup_default_allocator();
......
/*
* Copyright (C) the libgit2 contributors. All rights reserved.
*
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
*/
#include "failalloc.h"
void *git_failalloc_malloc(size_t len, const char *file, int line)
{
GIT_UNUSED(len);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
void *git_failalloc_calloc(size_t nelem, size_t elsize, const char *file, int line)
{
GIT_UNUSED(nelem);
GIT_UNUSED(elsize);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
char *git_failalloc_strdup(const char *str, const char *file, int line)
{
GIT_UNUSED(str);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
char *git_failalloc_strndup(const char *str, size_t n, const char *file, int line)
{
GIT_UNUSED(str);
GIT_UNUSED(n);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
char *git_failalloc_substrdup(const char *start, size_t n, const char *file, int line)
{
GIT_UNUSED(start);
GIT_UNUSED(n);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
void *git_failalloc_realloc(void *ptr, size_t size, const char *file, int line)
{
GIT_UNUSED(ptr);
GIT_UNUSED(size);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
void *git_failalloc_reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line)
{
GIT_UNUSED(ptr);
GIT_UNUSED(nelem);
GIT_UNUSED(elsize);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
void *git_failalloc_mallocarray(size_t nelem, size_t elsize, const char *file, int line)
{
GIT_UNUSED(nelem);
GIT_UNUSED(elsize);
GIT_UNUSED(file);
GIT_UNUSED(line);
return NULL;
}
void git_failalloc_free(void *ptr)
{
GIT_UNUSED(ptr);
}
/*
* Copyright (C) the libgit2 contributors. All rights reserved.
*
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
*/
#ifndef INCLUDE_allocators_failalloc_h__
#define INCLUDE_allocators_failalloc_h__
#include "common.h"
extern void *git_failalloc_malloc(size_t len, const char *file, int line);
extern void *git_failalloc_calloc(size_t nelem, size_t elsize, const char *file, int line);
extern char *git_failalloc_strdup(const char *str, const char *file, int line);
extern char *git_failalloc_strndup(const char *str, size_t n, const char *file, int line);
extern char *git_failalloc_substrdup(const char *start, size_t n, const char *file, int line);
extern void *git_failalloc_realloc(void *ptr, size_t size, const char *file, int line);
extern void *git_failalloc_reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line);
extern void *git_failalloc_mallocarray(size_t nelem, size_t elsize, const char *file, int line);
extern void git_failalloc_free(void *ptr);
#endif
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "threadstate.h" #include "threadstate.h"
#include "posix.h" #include "posix.h"
#include "buffer.h" #include "buffer.h"
#include "libgit2.h"
/******************************************** /********************************************
* New error handling * New error handling
...@@ -20,6 +21,11 @@ static git_error g_git_oom_error = { ...@@ -20,6 +21,11 @@ static git_error g_git_oom_error = {
GIT_ERROR_NOMEMORY GIT_ERROR_NOMEMORY
}; };
static git_error g_git_uninitialized_error = {
"libgit2 has not been initialized; you must call git_libgit2_init",
GIT_ERROR_INVALID
};
static void set_error_from_buffer(int error_class) static void set_error_from_buffer(int error_class)
{ {
git_error *error = &GIT_THREADSTATE->error_t; git_error *error = &GIT_THREADSTATE->error_t;
...@@ -131,6 +137,10 @@ void git_error_clear(void) ...@@ -131,6 +137,10 @@ void git_error_clear(void)
const git_error *git_error_last(void) const git_error *git_error_last(void)
{ {
/* If the library is not initialized, return a static error. */
if (!git_libgit2_init_count())
return &g_git_uninitialized_error;
return GIT_THREADSTATE->last_error; return GIT_THREADSTATE->last_error;
} }
......
...@@ -90,6 +90,11 @@ int git_libgit2_init(void) ...@@ -90,6 +90,11 @@ int git_libgit2_init(void)
return git_runtime_init(init_fns, ARRAY_SIZE(init_fns)); return git_runtime_init(init_fns, ARRAY_SIZE(init_fns));
} }
int git_libgit2_init_count(void)
{
return git_runtime_init_count();
}
int git_libgit2_shutdown(void) int git_libgit2_shutdown(void)
{ {
return git_runtime_shutdown(); return git_runtime_shutdown();
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#ifndef INCLUDE_libgit2_h__ #ifndef INCLUDE_libgit2_h__
#define INCLUDE_libgit2_h__ #define INCLUDE_libgit2_h__
extern int git_libgit2_init_count(void);
extern const char *git_libgit2__user_agent(void); extern const char *git_libgit2__user_agent(void);
extern const char *git_libgit2__ssl_ciphers(void); extern const char *git_libgit2__ssl_ciphers(void);
......
...@@ -127,6 +127,21 @@ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt) ...@@ -127,6 +127,21 @@ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt)
return ret; return ret;
} }
int git_runtime_init_count(void)
{
int ret;
if (init_lock() < 0)
return -1;
ret = git_atomic32_get(&init_count);
if (init_unlock() < 0)
return -1;
return ret;
}
int git_runtime_shutdown(void) int git_runtime_shutdown(void)
{ {
int ret; int ret;
......
...@@ -28,6 +28,15 @@ typedef void (*git_runtime_shutdown_fn)(void); ...@@ -28,6 +28,15 @@ typedef void (*git_runtime_shutdown_fn)(void);
*/ */
int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt); int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt);
/*
* Returns the number of initializations active (the number of calls to
* `git_runtime_init` minus the number of calls sto `git_runtime_shutdown`).
* If 0, the runtime is not currently initialized.
*
* @return The number of initializations performed or an error
*/
int git_runtime_init_count(void);
/** /**
* Shut down the runtime. If this is the last shutdown call, * Shut down the runtime. If this is the last shutdown call,
* such that there are no remaining `init` calls, then any * such that there are no remaining `init` calls, then any
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment