]> git.proxmox.com Git - libgit2.git/commitdiff
git_atomic_ssize for 64-bit atomics only on 64-bit platforms
authorEdward Thomson <ethomson@edwardthomson.com>
Thu, 25 Apr 2013 16:52:17 +0000 (11:52 -0500)
committerEdward Thomson <ethomson@edwardthomson.com>
Thu, 25 Apr 2013 17:40:33 +0000 (12:40 -0500)
CMakeLists.txt
src/cache.c
src/cache.h
src/thread-utils.h
src/util.c

index 6bd25aacc993773ae5cdaa0afce7fcb4d207eb73..1831c871778c591beb4ad69075a8035616497cef 100644 (file)
@@ -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})
index be4b037a33c0cfac1b9b8482fc83aad14a95eb1f..1360cc976998fc59bb29606e405acc1f1637bdaf 100644 (file)
@@ -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 */
index 16470e9c8beed362b0b9e400aa8e05da288a5551..53fbcf4e99b4ab9b2ff43b62802991c47ccbc869 100644 (file)
@@ -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);
 
index 28ecd297e828e281f3ea372805cdd4033f1f14b6..49b5f3b5e7bf6624fe2734732306cda6fdc96672 100644 (file)
@@ -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
  */
index ce67c7e62ce91e8831c3f3af5ef2eb3bc198963a..8c8bc1a6ceb1398b0ff3ba11bcae62a296366c5a 100644 (file)
@@ -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;
        }