mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 20:02:04 +00:00
git_atomic_ssize for 64-bit atomics only on 64-bit platforms
This commit is contained in:
parent
b4117e19b7
commit
eb63fda2e2
@ -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})
|
||||
|
13
src/cache.c
13
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 */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user