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 @@
#include "alloc.h"
#include "runtime.h"
#include "allocators/failalloc.h"
#include "allocators/stdalloc.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)
{
......@@ -25,10 +37,10 @@ static int setup_default_allocator(void)
int git_allocator_global_init(void)
{
/*
* We don't want to overwrite any allocator which has been set before
* the init function is called.
* We don't want to overwrite any allocator which has been set
* before the init function is called.
*/
if (git__allocator.gmalloc != NULL)
if (git__allocator.gmalloc != git_failalloc_malloc)
return 0;
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 @@
#include "threadstate.h"
#include "posix.h"
#include "buffer.h"
#include "libgit2.h"
/********************************************
* New error handling
......@@ -20,6 +21,11 @@ static git_error g_git_oom_error = {
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)
{
git_error *error = &GIT_THREADSTATE->error_t;
......@@ -131,6 +137,10 @@ void git_error_clear(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;
}
......
......@@ -90,6 +90,11 @@ int git_libgit2_init(void)
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)
{
return git_runtime_shutdown();
......
......@@ -7,6 +7,8 @@
#ifndef 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__ssl_ciphers(void);
......
......@@ -127,6 +127,21 @@ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt)
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 ret;
......
......@@ -28,6 +28,15 @@ typedef void (*git_runtime_shutdown_fn)(void);
*/
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,
* 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