mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-21 18:03:54 +00:00
Add an embryo of a TLS-aware error handling system
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>
This commit is contained in:
parent
3a2aabdce1
commit
ae23486285
2
Makefile
2
Makefile
@ -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
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include "cc-compat.h"
|
||||
#include "util.h"
|
||||
#include "errors.h"
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
23
src/errors.c
Normal file
23
src/errors.c
Normal file
@ -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
src/errors.h
Normal file
17
src/errors.h
Normal file
@ -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
src/git/errors.h
Normal file
25
src/git/errors.h
Normal file
@ -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
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user