summaryrefslogtreecommitdiff
path: root/src/libgit2/errors.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libgit2/errors.c')
-rw-r--r--src/libgit2/errors.c91
1 files changed, 73 insertions, 18 deletions
diff --git a/src/libgit2/errors.c b/src/libgit2/errors.c
index 3614b9ce5..2e58948d2 100644
--- a/src/libgit2/errors.c
+++ b/src/libgit2/errors.c
@@ -16,32 +16,51 @@
* New error handling
********************************************/
-static git_error g_git_oom_error = {
+static git_error oom_error = {
"Out of memory",
GIT_ERROR_NOMEMORY
};
-static git_error g_git_uninitialized_error = {
+static git_error uninitialized_error = {
"libgit2 has not been initialized; you must call git_libgit2_init",
GIT_ERROR_INVALID
};
+static git_error tlsdata_error = {
+ "thread-local data initialization failure",
+ GIT_ERROR
+};
+
static void set_error_from_buffer(int error_class)
{
- git_error *error = &GIT_THREADSTATE->error_t;
- git_str *buf = &GIT_THREADSTATE->error_buf;
+ git_threadstate *threadstate = git_threadstate_get();
+ git_error *error;
+ git_str *buf;
+
+ if (!threadstate)
+ return;
+
+ error = &threadstate->error_t;
+ buf = &threadstate->error_buf;
error->message = buf->ptr;
error->klass = error_class;
- GIT_THREADSTATE->last_error = error;
+ threadstate->last_error = error;
}
static void set_error(int error_class, char *string)
{
- git_str *buf = &GIT_THREADSTATE->error_buf;
+ git_threadstate *threadstate = git_threadstate_get();
+ git_str *buf;
+
+ if (!threadstate)
+ return;
+
+ buf = &threadstate->error_buf;
git_str_clear(buf);
+
if (string) {
git_str_puts(buf, string);
git__free(string);
@@ -52,7 +71,12 @@ static void set_error(int error_class, char *string)
void git_error_set_oom(void)
{
- GIT_THREADSTATE->last_error = &g_git_oom_error;
+ git_threadstate *threadstate = git_threadstate_get();
+
+ if (!threadstate)
+ return;
+
+ threadstate->last_error = &oom_error;
}
void git_error_set(int error_class, const char *fmt, ...)
@@ -69,10 +93,18 @@ void git_error_vset(int error_class, const char *fmt, va_list ap)
#ifdef GIT_WIN32
DWORD win32_error_code = (error_class == GIT_ERROR_OS) ? GetLastError() : 0;
#endif
+
+ git_threadstate *threadstate = git_threadstate_get();
int error_code = (error_class == GIT_ERROR_OS) ? errno : 0;
- git_str *buf = &GIT_THREADSTATE->error_buf;
+ git_str *buf;
+
+ if (!threadstate)
+ return;
+
+ buf = &threadstate->error_buf;
git_str_clear(buf);
+
if (fmt) {
git_str_vprintf(buf, fmt, ap);
if (error_class == GIT_ERROR_OS)
@@ -81,7 +113,7 @@ void git_error_vset(int error_class, const char *fmt, va_list ap)
if (error_class == GIT_ERROR_OS) {
#ifdef GIT_WIN32
- char * win32_error = git_win32_get_error_message(win32_error_code);
+ char *win32_error = git_win32_get_error_message(win32_error_code);
if (win32_error) {
git_str_puts(buf, win32_error);
git__free(win32_error);
@@ -103,10 +135,16 @@ void git_error_vset(int error_class, const char *fmt, va_list ap)
int git_error_set_str(int error_class, const char *string)
{
- git_str *buf = &GIT_THREADSTATE->error_buf;
+ git_threadstate *threadstate = git_threadstate_get();
+ git_str *buf;
GIT_ASSERT_ARG(string);
+ if (!threadstate)
+ return -1;
+
+ buf = &threadstate->error_buf;
+
git_str_clear(buf);
git_str_puts(buf, string);
@@ -119,9 +157,14 @@ int git_error_set_str(int error_class, const char *string)
void git_error_clear(void)
{
- if (GIT_THREADSTATE->last_error != NULL) {
+ git_threadstate *threadstate = git_threadstate_get();
+
+ if (!threadstate)
+ return;
+
+ if (threadstate->last_error != NULL) {
set_error(0, NULL);
- GIT_THREADSTATE->last_error = NULL;
+ threadstate->last_error = NULL;
}
errno = 0;
@@ -132,17 +175,29 @@ void git_error_clear(void)
const git_error *git_error_last(void)
{
+ git_threadstate *threadstate;
+
/* If the library is not initialized, return a static error. */
if (!git_libgit2_init_count())
- return &g_git_uninitialized_error;
+ return &uninitialized_error;
+
+ if ((threadstate = git_threadstate_get()) == NULL)
+ return &tlsdata_error;
- return GIT_THREADSTATE->last_error;
+ return threadstate->last_error;
}
int git_error_state_capture(git_error_state *state, int error_code)
{
- git_error *error = GIT_THREADSTATE->last_error;
- git_str *error_buf = &GIT_THREADSTATE->error_buf;
+ git_threadstate *threadstate = git_threadstate_get();
+ git_error *error;
+ git_str *error_buf;
+
+ if (!threadstate)
+ return -1;
+
+ error = threadstate->last_error;
+ error_buf = &threadstate->error_buf;
memset(state, 0, sizeof(git_error_state));
@@ -150,13 +205,13 @@ int git_error_state_capture(git_error_state *state, int error_code)
return 0;
state->error_code = error_code;
- state->oom = (error == &g_git_oom_error);
+ state->oom = (error == &oom_error);
if (error) {
state->error_msg.klass = error->klass;
if (state->oom)
- state->error_msg.message = g_git_oom_error.message;
+ state->error_msg.message = oom_error.message;
else
state->error_msg.message = git_str_detach(error_buf);
}