summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2013-04-25 11:52:17 -0500
committerEdward Thomson <ethomson@edwardthomson.com>2013-04-25 12:40:33 -0500
commiteb63fda2e24d007e31742587984a30e086249d43 (patch)
tree79d98a9ec5fae1586ab777c80e3d4f164f03a578
parentb4117e19b7a968f8e6b878d81c58a462093cf1b3 (diff)
downloadlibgit2-eb63fda2e24d007e31742587984a30e086249d43.tar.gz
git_atomic_ssize for 64-bit atomics only on 64-bit platforms
-rw-r--r--CMakeLists.txt9
-rw-r--r--src/cache.c13
-rw-r--r--src/cache.h6
-rw-r--r--src/thread-utils.h30
-rw-r--r--src/util.c6
5 files changed, 48 insertions, 16 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6bd25aacc..1831c8717 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -277,6 +277,15 @@ ELSE()
ENDIF()
FILE(GLOB SRC_GIT2 src/*.c src/transports/*.c src/xdiff/*.c)
+# Determine architecture of the machine
+IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ ADD_DEFINITIONS(-DGIT_ARCH_64)
+ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4)
+ ADD_DEFINITIONS(-DGIT_ARCH_32)
+ELSE()
+ message(FATAL_ERROR "Unsupported architecture")
+ENDIF()
+
# Compile and link libgit2
ADD_LIBRARY(git2 ${SRC_GIT2} ${SRC_OS} ${SRC_ZLIB} ${SRC_HTTP} ${SRC_REGEX} ${SRC_SHA1} ${WIN_RC})
TARGET_LINK_LIBRARIES(git2 ${SSL_LIBRARIES})
diff --git a/src/cache.c b/src/cache.c
index be4b037a3..1360cc976 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -18,8 +18,8 @@
GIT__USE_OIDMAP
bool git_cache__enabled = true;
-int64_t git_cache__max_storage = (256 * 1024 * 1024);
-git_atomic64 git_cache__current_storage = {0};
+ssize_t git_cache__max_storage = (256 * 1024 * 1024);
+git_atomic_ssize git_cache__current_storage = {0};
static size_t git_cache__max_object_size[8] = {
0, /* GIT_OBJ__EXT1 */
@@ -85,7 +85,7 @@ static void clear_cache(git_cache *cache)
});
kh_clear(oid, cache->map);
- git_atomic64_add(&git_cache__current_storage, -cache->used_memory);
+ git_atomic_ssize_add(&git_cache__current_storage, -cache->used_memory);
cache->used_memory = 0;
}
@@ -111,7 +111,8 @@ void git_cache_free(git_cache *cache)
static void cache_evict_entries(git_cache *cache)
{
uint32_t seed = rand();
- int64_t evicted_memory = 0, evict_count = 8;
+ size_t evict_count = 8;
+ ssize_t evicted_memory = 0;
/* do not infinite loop if there's not enough entries to evict */
if (evict_count > kh_size(cache->map)) {
@@ -134,7 +135,7 @@ static void cache_evict_entries(git_cache *cache)
}
cache->used_memory -= evicted_memory;
- git_atomic64_add(&git_cache__current_storage, -evicted_memory);
+ git_atomic_ssize_add(&git_cache__current_storage, -evicted_memory);
}
static bool cache_should_store(git_otype object_type, size_t object_size)
@@ -195,7 +196,7 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry)
kh_val(cache->map, pos) = entry;
git_cached_obj_incref(entry);
cache->used_memory += entry->size;
- git_atomic64_add(&git_cache__current_storage, (int64_t)entry->size);
+ git_atomic_ssize_add(&git_cache__current_storage, (ssize_t)entry->size);
}
}
/* found */
diff --git a/src/cache.h b/src/cache.h
index 16470e9c8..53fbcf4e9 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -31,12 +31,12 @@ typedef struct {
typedef struct {
git_oidmap *map;
git_mutex lock;
- int64_t used_memory;
+ ssize_t used_memory;
} git_cache;
extern bool git_cache__enabled;
-extern int64_t git_cache__max_storage;
-extern git_atomic64 git_cache__current_storage;
+extern ssize_t git_cache__max_storage;
+extern git_atomic_ssize git_cache__current_storage;
int git_cache_set_max_object_size(git_otype type, size_t size);
diff --git a/src/thread-utils.h b/src/thread-utils.h
index 28ecd297e..49b5f3b5e 100644
--- a/src/thread-utils.h
+++ b/src/thread-utils.h
@@ -18,6 +18,8 @@ typedef struct {
#endif
} git_atomic;
+#ifdef GIT_ARCH_64
+
typedef struct {
#if defined(GIT_WIN32)
__int64 val;
@@ -26,6 +28,18 @@ typedef struct {
#endif
} git_atomic64;
+typedef git_atomic64 git_atomic_ssize;
+
+#define git_atomic_ssize_add git_atomic64_add
+
+#else
+
+typedef git_atomic git_atomic_ssize;
+
+#define git_atomic_ssize_add git_atomic_add
+
+#endif
+
GIT_INLINE(void) git_atomic_set(git_atomic *a, int val)
{
a->val = val;
@@ -68,7 +82,7 @@ GIT_INLINE(int) git_atomic_inc(git_atomic *a)
GIT_INLINE(int) git_atomic_add(git_atomic *a, int32_t addend)
{
#if defined(GIT_WIN32)
- return _InterlockedExchangeAdd(&a->val, addend);
+ return InterlockedExchangeAdd(&a->val, addend);
#elif defined(__GNUC__)
return __sync_add_and_fetch(&a->val, addend);
#else
@@ -101,10 +115,12 @@ GIT_INLINE(void *) git___compare_and_swap(
return (foundval == oldval) ? oldval : newval;
}
-GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
+#ifdef GIT_ARCH_64
+
+GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
{
#if defined(GIT_WIN32)
- return _InterlockedExchangeAdd64(&a->val, addend);
+ return InterlockedExchangeAdd64(&a->val, addend);
#elif defined(__GNUC__)
return __sync_add_and_fetch(&a->val, addend);
#else
@@ -112,6 +128,8 @@ GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
#endif
}
+#endif
+
#else
#define git_thread unsigned int
@@ -161,7 +179,9 @@ GIT_INLINE(void *) git___compare_and_swap(
return oldval;
}
-GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
+#ifdef GIT_ARCH_64
+
+GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
{
a->val += addend;
return a->val;
@@ -169,6 +189,8 @@ GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
#endif
+#endif
+
/* Atomically replace oldval with newval
* @return oldval if it was replaced or newval if it was not
*/
diff --git a/src/util.c b/src/util.c
index ce67c7e62..8c8bc1a6c 100644
--- a/src/util.c
+++ b/src/util.c
@@ -103,7 +103,7 @@ int git_libgit2_opts(int key, ...)
}
case GIT_OPT_SET_CACHE_MAX_SIZE:
- git_cache__max_storage = va_arg(ap, int64_t);
+ git_cache__max_storage = va_arg(ap, ssize_t);
break;
case GIT_OPT_ENABLE_CACHING:
@@ -111,8 +111,8 @@ int git_libgit2_opts(int key, ...)
break;
case GIT_OPT_GET_CACHED_MEMORY:
- *(va_arg(ap, int64_t *)) = git_cache__current_storage.val;
- *(va_arg(ap, int64_t *)) = git_cache__max_storage;
+ *(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
+ *(va_arg(ap, ssize_t *)) = git_cache__max_storage;
break;
}