Skip to content

Commit

Permalink
Add an embryo of a TLS-aware error handling system
Browse files Browse the repository at this point in the history
This adds the per-thread global variable git_errno to the
system, which callers can examine to get information about
an error.

Two helper functions are added to reduce LoC-count for the
library code itself.

Also, some exceptions are made for running sparse on GIT_TLS
definitions, since it doesn't grok thread-local variables at
all.

Signed-off-by: Andreas Ericsson <ae@op5.se>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
ageric authored and spearce committed Nov 22, 2008
1 parent 3a2aabd commit ae23486
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -41,7 +41,7 @@ apidocs:
test: $(TEST_RUN)

sparse:
@for i in $(SRC_C); do sparse $$i $(SPARSE_FLAGS) $(BASIC_CFLAGS) $(CFLAGS); done
@for i in $(SRC_C); do sparse $$i -DSPARSE_IS_RUNNING $(SPARSE_FLAGS) $(BASIC_CFLAGS) $(CFLAGS); done

install-headers: $(PUBLIC_HEADERS)
@mkdir -p /tmp/gitinc/git
Expand Down
1 change: 1 addition & 0 deletions src/common.h
Expand Up @@ -3,6 +3,7 @@

#include "cc-compat.h"
#include "util.h"
#include "errors.h"
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
Expand Down
23 changes: 23 additions & 0 deletions src/errors.c
@@ -0,0 +1,23 @@
#include "common.h"
#include "thread-utils.h" /* for GIT_TLS */

/* compile-time constant initialization required */
GIT_TLS int git_errno = 0;

static struct {
int num;
const char *str;
} error_codes[] = {
{ GIT_ENOTOID, "Not a git oid" },
{ GIT_ENOTFOUND, "Object does not exist in the scope searched" },
};

const char *git_strerror(int num)
{
int i;
for (i = 0; i < ARRAY_SIZE(error_codes); i++)
if (num == error_codes[i].num)
return error_codes[i].str;

return "Unknown error";
}
17 changes: 17 additions & 0 deletions src/errors.h
@@ -0,0 +1,17 @@
#ifndef INCLUDE_errors_h__
#define INCLUDE_errors_h__
#include "git/errors.h"

/* convenience functions */
static inline int git_int_error(int code)
{
git_errno = code;
return code;
}

static inline void *git_ptr_error(int code)
{
git_errno = code;
return NULL;
}
#endif
25 changes: 25 additions & 0 deletions src/git/errors.h
@@ -0,0 +1,25 @@
#ifndef INCLUDE_git_errors_h__
#define INCLUDE_git_errors_h__
/**
* @file git/errors.h
* @brief Git error handling routines and variables
* @ingroup Git
* @{
*/

#include "common.h"
#include "thread-utils.h"
GIT_BEGIN_DECL

/** The git errno. */
GIT_EXTERN(int) GIT_TLS git_errno;

/**
* strerror() for the Git library
* @param num The error code to explain
* @return a string explaining the error code
*/
GIT_EXTERN(const char *) git_strerror(int num);
/** @} */
GIT_END_DECL
#endif
7 changes: 7 additions & 0 deletions src/git/thread-utils.h
Expand Up @@ -22,4 +22,11 @@
# define GIT_TLS /* nothing: tls vars are thread-global */
#endif

/* sparse doesn't grok thread-local variables */
#ifdef SPARSE_IS_RUNNING
# undef GIT_HAS_TLS
# undef GIT_TLS
# define GIT_TLS
#endif

#endif /* INCLUDE_git_thread_utils_h__ */

0 comments on commit ae23486

Please sign in to comment.