diff options
| -rw-r--r-- | src/cache.c | 23 | ||||
| -rw-r--r-- | src/describe.c | 7 | ||||
| -rw-r--r-- | src/merge.c | 18 | ||||
| -rw-r--r-- | src/odb_mempack.c | 16 | ||||
| -rw-r--r-- | src/oidmap.c | 9 | ||||
| -rw-r--r-- | src/oidmap.h | 9 | ||||
| -rw-r--r-- | src/pack-objects.c | 13 | ||||
| -rw-r--r-- | src/pack.c | 7 | ||||
| -rw-r--r-- | src/revwalk.c | 5 | ||||
| -rw-r--r-- | tests/core/oidmap.c | 78 |
10 files changed, 123 insertions, 62 deletions
diff --git a/src/cache.c b/src/cache.c index 424aaae84..ec3d9d17b 100644 --- a/src/cache.c +++ b/src/cache.c @@ -151,16 +151,12 @@ static bool cache_should_store(git_object_t object_type, size_t object_size) static void *cache_get(git_cache *cache, const git_oid *oid, unsigned int flags) { - size_t pos; - git_cached_obj *entry = NULL; + git_cached_obj *entry; if (!git_cache__enabled || git_rwlock_rdlock(&cache->lock) < 0) return NULL; - pos = git_oidmap_lookup_index(cache->map, oid); - if (git_oidmap_valid_index(cache->map, pos)) { - entry = git_oidmap_value_at(cache->map, pos); - + if ((entry = git_oidmap_get(cache->map, oid)) != NULL) { if (flags && entry->flags != flags) { entry = NULL; } else { @@ -175,7 +171,7 @@ static void *cache_get(git_cache *cache, const git_oid *oid, unsigned int flags) static void *cache_store(git_cache *cache, git_cached_obj *entry) { - size_t pos; + git_cached_obj *stored_entry; git_cached_obj_incref(entry); @@ -194,10 +190,8 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry) if (git_cache__current_storage.val > git_cache__max_storage) cache_evict_entries(cache); - pos = git_oidmap_lookup_index(cache->map, &entry->oid); - /* not found */ - if (!git_oidmap_valid_index(cache->map, pos)) { + if ((stored_entry = git_oidmap_get(cache->map, &entry->oid)) == NULL) { int rval; git_oidmap_insert(cache->map, &entry->oid, entry, &rval); @@ -209,19 +203,18 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry) } /* found */ else { - git_cached_obj *stored_entry = git_oidmap_value_at(cache->map, pos); - if (stored_entry->flags == entry->flags) { git_cached_obj_decref(entry); git_cached_obj_incref(stored_entry); entry = stored_entry; } else if (stored_entry->flags == GIT_CACHE_STORE_RAW && - entry->flags == GIT_CACHE_STORE_PARSED) { + entry->flags == GIT_CACHE_STORE_PARSED) { + int rval; + git_cached_obj_decref(stored_entry); git_cached_obj_incref(entry); - git_oidmap_set_key_at(cache->map, pos, &entry->oid); - git_oidmap_set_value_at(cache->map, pos, entry); + git_oidmap_insert(cache->map, &entry->oid, entry, &rval); } else { /* NO OP */ } diff --git a/src/describe.c b/src/describe.c index 2cfa75f40..62d8860b6 100644 --- a/src/describe.c +++ b/src/describe.c @@ -36,12 +36,7 @@ struct commit_name { static void *oidmap_value_bykey(git_oidmap *map, const git_oid *key) { - size_t pos = git_oidmap_lookup_index(map, key); - - if (!git_oidmap_valid_index(map, pos)) - return NULL; - - return git_oidmap_value_at(map, pos); + return git_oidmap_get(map, key); } static struct commit_name *find_commit_name( diff --git a/src/merge.c b/src/merge.c index 22df380b8..b8bb1947f 100644 --- a/src/merge.c +++ b/src/merge.c @@ -1104,14 +1104,13 @@ static void deletes_by_oid_free(git_oidmap *map) { git_oidmap_free(map); } -static int deletes_by_oid_enqueue(git_oidmap *map, git_pool* pool, const git_oid *id, size_t idx) { - size_t pos; +static int deletes_by_oid_enqueue(git_oidmap *map, git_pool* pool, const git_oid *id, size_t idx) +{ deletes_by_oid_queue *queue; size_t *array_entry; int error; - pos = git_oidmap_lookup_index(map, id); - if (!git_oidmap_valid_index(map, pos)) { + if ((queue = git_oidmap_get(map, id)) == NULL) { queue = git_pool_malloc(pool, sizeof(deletes_by_oid_queue)); GIT_ERROR_CHECK_ALLOC(queue); @@ -1123,7 +1122,6 @@ static int deletes_by_oid_enqueue(git_oidmap *map, git_pool* pool, const git_oid if (error < 0) return -1; } else { - queue = git_oidmap_value_at(map, pos); array_entry = git_array_alloc(queue->arr); GIT_ERROR_CHECK_ALLOC(array_entry); *array_entry = idx; @@ -1132,18 +1130,14 @@ static int deletes_by_oid_enqueue(git_oidmap *map, git_pool* pool, const git_oid return 0; } -static int deletes_by_oid_dequeue(size_t *idx, git_oidmap *map, const git_oid *id) { - size_t pos; +static int deletes_by_oid_dequeue(size_t *idx, git_oidmap *map, const git_oid *id) +{ deletes_by_oid_queue *queue; size_t *array_entry; - pos = git_oidmap_lookup_index(map, id); - - if (!git_oidmap_valid_index(map, pos)) + if ((queue = git_oidmap_get(map, id)) == NULL) return GIT_ENOTFOUND; - queue = git_oidmap_value_at(map, pos); - if (queue->next_pos == 0) { *idx = queue->first_entry; } else { diff --git a/src/odb_mempack.c b/src/odb_mempack.c index c68e5932e..e66f2e942 100644 --- a/src/odb_mempack.c +++ b/src/odb_mempack.c @@ -79,15 +79,11 @@ static int impl__exists(git_odb_backend *backend, const git_oid *oid) static int impl__read(void **buffer_p, size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid) { struct memory_packer_db *db = (struct memory_packer_db *)backend; - struct memobject *obj = NULL; - size_t pos; + struct memobject *obj; - pos = git_oidmap_lookup_index(db->objects, oid); - if (!git_oidmap_valid_index(db->objects, pos)) + if ((obj = git_oidmap_get(db->objects, oid)) == NULL) return GIT_ENOTFOUND; - obj = git_oidmap_value_at(db->objects, pos); - *len_p = obj->len; *type_p = obj->type; *buffer_p = git__malloc(obj->len); @@ -100,15 +96,11 @@ static int impl__read(void **buffer_p, size_t *len_p, git_object_t *type_p, git_ static int impl__read_header(size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid) { struct memory_packer_db *db = (struct memory_packer_db *)backend; - struct memobject *obj = NULL; - size_t pos; + struct memobject *obj; - pos = git_oidmap_lookup_index(db->objects, oid); - if (!git_oidmap_valid_index(db->objects, pos)) + if ((obj = git_oidmap_get(db->objects, oid)) == NULL) return GIT_ENOTFOUND; - obj = git_oidmap_value_at(db->objects, pos); - *len_p = obj->len; *type_p = obj->type; return 0; diff --git a/src/oidmap.c b/src/oidmap.c index 6b2180766..1e2b8124b 100644 --- a/src/oidmap.c +++ b/src/oidmap.c @@ -48,6 +48,15 @@ size_t git_oidmap_size(git_oidmap *map) return kh_size(map); } +void *git_oidmap_get(git_oidmap *map, const git_oid *key) +{ + size_t idx = git_oidmap_lookup_index(map, key); + if (!git_oidmap_valid_index(map, idx) || + !git_oidmap_has_data(map, idx)) + return NULL; + return kh_val(map, idx); +} + size_t git_oidmap_lookup_index(git_oidmap *map, const git_oid *key) { return kh_get(oid, map, key); diff --git a/src/oidmap.h b/src/oidmap.h index c44f7228e..799fec402 100644 --- a/src/oidmap.h +++ b/src/oidmap.h @@ -52,6 +52,15 @@ void git_oidmap_clear(git_oidmap *map); */ size_t git_oidmap_size(git_oidmap *map); +/** + * Return value associated with the given key. + * + * @param map map to search key in + * @param key key to search for + * @return value associated with the given key or NULL if the key was not found + */ +void *git_oidmap_get(git_oidmap *map, const git_oid *key); + size_t git_oidmap_lookup_index(git_oidmap *map, const git_oid *key); int git_oidmap_valid_index(git_oidmap *map, size_t idx); diff --git a/src/pack-objects.c b/src/pack-objects.c index 4ccc84d4b..094317a80 100644 --- a/src/pack-objects.c +++ b/src/pack-objects.c @@ -512,15 +512,12 @@ static int cb_tag_foreach(const char *name, git_oid *oid, void *data) { git_packbuilder *pb = data; git_pobject *po; - size_t pos; GIT_UNUSED(name); - pos = git_oidmap_lookup_index(pb->object_ix, oid); - if (!git_oidmap_valid_index(pb->object_ix, pos)) + if ((po = git_oidmap_get(pb->object_ix, oid)) == NULL) return 0; - po = git_oidmap_value_at(pb->object_ix, pos); po->tagged = 1; /* TODO: peel objects */ @@ -1537,14 +1534,10 @@ static int lookup_walk_object(struct walk_object **out, git_packbuilder *pb, con static int retrieve_object(struct walk_object **out, git_packbuilder *pb, const git_oid *id) { - int error; - size_t pos; struct walk_object *obj; + int error; - pos = git_oidmap_lookup_index(pb->walk_objects, id); - if (git_oidmap_valid_index(pb->walk_objects, pos)) { - obj = git_oidmap_value_at(pb->walk_objects, pos); - } else { + if ((obj = git_oidmap_get(pb->walk_objects, id)) == NULL) { if ((error = lookup_walk_object(&obj, pb, id)) < 0) return error; diff --git a/src/pack.c b/src/pack.c index 88af6afd4..650d20346 100644 --- a/src/pack.c +++ b/src/pack.c @@ -957,14 +957,13 @@ git_off_t get_delta_base( } else if (type == GIT_OBJECT_REF_DELTA) { /* If we have the cooperative cache, search in it first */ if (p->has_cache) { + struct git_pack_entry *entry; git_oid oid; - size_t k; git_oid_fromraw(&oid, base_info); - k = git_oidmap_lookup_index(p->idx_cache, &oid); - if (git_oidmap_valid_index(p->idx_cache, k)) { + if ((entry = git_oidmap_get(p->idx_cache, &oid)) != NULL) { *curpos += 20; - return ((struct git_pack_entry *)git_oidmap_value_at(p->idx_cache, k))->offset; + return entry->offset; } else { /* If we're building an index, don't try to find the pack * entry; we just haven't seen it yet. We'll make diff --git a/src/revwalk.c b/src/revwalk.c index b28c341b1..a052a646d 100644 --- a/src/revwalk.c +++ b/src/revwalk.c @@ -25,9 +25,8 @@ git_commit_list_node *git_revwalk__commit_lookup( int ret; /* lookup and reserve space if not already present */ - pos = git_oidmap_lookup_index(walk->commits, oid); - if (git_oidmap_valid_index(walk->commits, pos)) - return git_oidmap_value_at(walk->commits, pos); + if ((commit = git_oidmap_get(walk->commits, oid)) != NULL) + return commit; commit = git_commit_list_alloc_node(walk); if (commit == NULL) diff --git a/tests/core/oidmap.c b/tests/core/oidmap.c index 519b5875e..0e66b7291 100644 --- a/tests/core/oidmap.c +++ b/tests/core/oidmap.c @@ -104,3 +104,81 @@ void test_core_oidmap__hash_collision(void) git_oidmap_free(map); } + +void test_core_oidmap__get_succeeds_with_existing_keys(void) +{ + git_oidmap *map; + oidmap_item items[NITEMS]; + uint32_t i, j; + + for (i = 0; i < NITEMS; ++i) { + uint32_t segment = i / 8; + int modi = i - (segment * 8); + + items[i].extra = i; + + for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { + items[i].oid.id[j * 4 ] = (unsigned char)modi; + items[i].oid.id[j * 4 + 1] = (unsigned char)(modi >> 8); + items[i].oid.id[j * 4 + 2] = (unsigned char)(modi >> 16); + items[i].oid.id[j * 4 + 3] = (unsigned char)(modi >> 24); + } + + items[i].oid.id[ 8] = (unsigned char)i; + items[i].oid.id[ 9] = (unsigned char)(i >> 8); + items[i].oid.id[10] = (unsigned char)(i >> 16); + items[i].oid.id[11] = (unsigned char)(i >> 24); + } + + cl_git_pass(git_oidmap_new(&map)); + + for (i = 0; i < NITEMS; ++i) { + int ret; + git_oidmap_insert(map, &items[i].oid, &items[i], &ret); + cl_assert(ret == 1); + } + + for (i = 0; i < NITEMS; ++i) + cl_assert_equal_p(git_oidmap_get(map, &items[i].oid), &items[i]); + + git_oidmap_free(map); +} + +void test_core_oidmap__get_fails_with_nonexisting_key(void) +{ + git_oidmap *map; + oidmap_item items[NITEMS]; + uint32_t i, j; + + for (i = 0; i < NITEMS; ++i) { + uint32_t segment = i / 8; + int modi = i - (segment * 8); + + items[i].extra = i; + + for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { + items[i].oid.id[j * 4 ] = (unsigned char)modi; + items[i].oid.id[j * 4 + 1] = (unsigned char)(modi >> 8); + items[i].oid.id[j * 4 + 2] = (unsigned char)(modi >> 16); + items[i].oid.id[j * 4 + 3] = (unsigned char)(modi >> 24); + } + + items[i].oid.id[ 8] = (unsigned char)i; + items[i].oid.id[ 9] = (unsigned char)(i >> 8); + items[i].oid.id[10] = (unsigned char)(i >> 16); + items[i].oid.id[11] = (unsigned char)(i >> 24); + } + + cl_git_pass(git_oidmap_new(&map)); + + /* Do _not_ add last OID to verify that we cannot look it up */ + for (i = 0; i < NITEMS - 1; ++i) { + int ret; + git_oidmap_insert(map, &items[i].oid, &items[i], &ret); + cl_assert(ret == 1); + } + + cl_assert_equal_p(git_oidmap_get(map, &items[NITEMS - 1].oid), NULL); + + git_oidmap_free(map); +} |
