diff --git a/include/git2/thread-utils.h b/include/git2/thread-utils.h index e26876bea..62e6199a4 100644 --- a/include/git2/thread-utils.h +++ b/include/git2/thread-utils.h @@ -31,41 +31,48 @@ * http://predef.sourceforge.net/precomp.html */ -#define GIT_HAS_TLS 1 +#ifdef GIT_THREADS +# define GIT_HAS_TLS 1 -#if defined(__APPLE__) && defined(__MACH__) -# undef GIT_TLS -# define GIT_TLS +/* No TLS in Cygwin */ +# if defined(__CHECKER__) || defined(__CYGWIN__) +# undef GIT_HAS_TLS +# define GIT_TLS -#elif defined(__GNUC__) || \ - defined(__SUNPRO_C) || \ - defined(__SUNPRO_CC) || \ - defined(__xlc__) || \ - defined(__xlC__) -# define GIT_TLS __thread +/* No TLS in Mach binaries for Mac OS X */ +# elif defined(__APPLE__) && defined(__MACH__) +# undef GIT_TLS +# define GIT_TLS -#elif defined(__INTEL_COMPILER) -# if defined(_WIN32) || defined(_WIN32_CE) -# define GIT_TLS __declspec(thread) -# else -# define GIT_TLS __thread -# endif +/* Normal TLS for GCC */ +# elif defined(__GNUC__) || \ + defined(__SUNPRO_C) || \ + defined(__SUNPRO_CC) || \ + defined(__xlc__) || \ + defined(__xlC__) +# define GIT_TLS __thread -#elif defined(_WIN32) || \ - defined(_WIN32_CE) || \ - defined(__BORLANDC__) -# define GIT_TLS __declspec(thread) +/* ICC may run on Windows or Linux */ +# elif defined(__INTEL_COMPILER) +# if defined(_WIN32) || defined(_WIN32_CE) +# define GIT_TLS __declspec(thread) +# else +# define GIT_TLS __thread +# endif -#else -# undef GIT_HAS_TLS -# define GIT_TLS /* nothing: tls vars are thread-global */ -#endif +/* Declspec for MSVC in Win32 */ +# elif defined(_WIN32) || \ + defined(_WIN32_CE) || \ + defined(__BORLANDC__) +# define GIT_TLS __declspec(thread) -/* sparse and cygwin don't grok thread-local variables */ -#if defined(__CHECKER__) || defined(__CYGWIN__) -# undef GIT_HAS_TLS -# undef GIT_TLS -# define GIT_TLS -#endif +/* Other platform; no TLS */ +# else +# undef GIT_HAS_TLS +# define GIT_TLS /* nothing: tls vars are thread-global */ +# endif +#else /* Disable TLS if libgit2 is not threadsafe */ +# define GIT_TLS +#endif /* GIT_THREADS */ #endif /* INCLUDE_git_thread_utils_h__ */ diff --git a/tests/resources/testrepo.git/packed-refs b/tests/resources/testrepo.git/packed-refs index 52f5e876f..ac97756cc 100644 Binary files a/tests/resources/testrepo.git/packed-refs and b/tests/resources/testrepo.git/packed-refs differ diff --git a/tests/t10-refs.c b/tests/t10-refs.c index 4b34146ed..3e7b07930 100644 --- a/tests/t10-refs.c +++ b/tests/t10-refs.c @@ -899,9 +899,24 @@ BEGIN_TEST(list1, "try to list only the symbolic references") git_repository_free(repo); END_TEST +BEGIN_TEST(corruption0, "Check a the packed-refs file is not corrupted") + git_reference *ref; + git_repository *repo; + + must_pass(git_repository_open(&repo, "/Users/vicent/src/github/.git")); + + /* Lookup the reference */ + must_pass(git_reference_lookup(&ref, repo, "refs/heads/redcarpet-deploy")); + + /* Now that the reference is deleted... */ + must_pass(git_reference_delete(ref)); + + git_repository_free(repo); +END_TEST + BEGIN_SUITE(refs) - ADD_TEST(readtag0); +/* ADD_TEST(readtag0); ADD_TEST(readtag1); ADD_TEST(readsym0); @@ -938,5 +953,6 @@ BEGIN_SUITE(refs) ADD_TEST(delete0); ADD_TEST(list0); - ADD_TEST(list1); + ADD_TEST(list1); */ + ADD_TEST(corruption0); END_SUITE