summaryrefslogtreecommitdiff
path: root/src/cache.c
Commit message (Collapse)AuthorAgeFilesLines
* Refactor git_cache to use an rwlockJustin Spahr-Summers2014-08-261-9/+9
| | | | | This significantly reduces contention when many threads are trying to read from the cache simultaneously.
* util: It's called `memzero`Vicent Marti2013-06-121-1/+1
|
* Add safe memset and use itRussell Belfer2013-06-071-1/+1
| | | | | | This adds a `git__memset` routine that will not be optimized away and updates the places where I memset() right before a free() call to use it.
* Mutex init can failRussell Belfer2013-05-311-1/+4
| | | | | | | It is obviously quite a serious problem if this happens, but mutex initialization can fail and we should detect it. It's a bit like a memory allocation failure, in that you're probably pretty screwed if this occurs, but at least we'll catch it.
* Zero memory for major objects before freeingRussell Belfer2013-05-311-2/+2
| | | | | | | By zeroing out the memory when we free larger objects (i.e. those that serve as collections of other data, such as repos, odb, refdb), I'm hoping that it will be easier for libgit2 bindings to find errors in their object management code.
* Docs for git_libgit2_opts and cache disable tweakRussell Belfer2013-05-241-0/+5
| | | | | | | This adds docs for the cache control options to git_libgit2_opts and also tweaks the cache code so that if the cache is disabled, then the next time we attempt to insert something into the cache in question, we will actually clear any old cached objects.
* git_atomic_ssize for 64-bit atomics only on 64-bit platformsEdward Thomson2013-04-251-6/+7
|
* repo: Add `git_repository__cleanup`Vicent Marti2013-04-241-0/+3
|
* opts: Add getter for cached memoryvmg/atomic64Vicent Marti2013-04-231-2/+1
|
* cache: More aggressive defaultVicent Marti2013-04-221-1/+1
|
* cache: Shared meter for memory usageVicent Marti2013-04-221-4/+12
|
* cache: Max cache size, and evict when the cache fills upvmg/new-cacheVicent Marti2013-04-221-7/+18
|
* Add callback to git_objects_tableRussell Belfer2013-04-221-6/+8
| | | | | | | | | | This adds create and free callback to the git_objects_table so that more of the creation and destruction of objects can be table driven instead of using switch statements. This also makes the semantics of certain object creation functions consistent so that we can make better use of function pointers. This also fixes a theoretical error case where an object allocation fails and we end up storing NULL into the cache.
* Add range checking around cache optsRussell Belfer2013-04-221-6/+17
| | | | | | | Add a git_cache_set_max_object_size method that does more checking around setting the max object size. Also add a git_cache_size to read the number of objects currently in the cache. This makes it easier to write tests.
* Global option settersVicent Marti2013-04-221-6/+4
|
* Clear the cache when there are too many items to expireVicent Marti2013-04-221-1/+20
|
* Some statsVicent Marti2013-04-221-0/+21
|
* Per-object max sizeVicent Marti2013-04-221-28/+28
|
* What has science done.Vicent Marti2013-04-221-2/+2
|
* Random evictionVicent Marti2013-04-221-1/+18
|
* Per-object filteringVicent Marti2013-04-221-6/+31
|
* lol this worked first try wtfVicent Marti2013-04-221-61/+108
|
* update copyrightsEdward Thomson2013-01-081-1/+1
|
* orite C89Justin Spahr-Summers2012-12-091-2/+2
|
* Always check the result of git_mutex_lockJustin Spahr-Summers2012-12-091-5/+13
|
* Fix a mutex/critical section leakPhilip Kelley2012-11-091-0/+1
|
* cache: fix race conditionMichael Schubert2012-09-111-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Example: a cached node is owned only by the cache (refcount == 1). Thread A holds the lock and determines that the entry which should get cached equals the node (git_oid_cmp(&node->oid, &entry->oid) == 0). It frees the given entry to instead return the cached node to the user (entry = node). Now, before Thread A happens to increment the refcount of the node *outside* the cache lock, Thread B tries to store another entry and hits the slot of the node before, decrements its refcount and frees it *before* Thread A gets a chance to increment for the user. git_cached_obj_incref(entry); git_mutex_lock(&cache->lock); { git_cached_obj *node = cache->nodes[hash & cache->size_mask]; if (node == NULL) { cache->nodes[hash & cache->size_mask] = entry; } else if (git_oid_cmp(&node->oid, &entry->oid) == 0) { git_cached_obj_decref(entry, cache->free_obj); entry = node; } else { git_cached_obj_decref(node, cache->free_obj); // Thread B is here cache->nodes[hash & cache->size_mask] = entry; } } git_mutex_unlock(&cache->lock); // Thread A is here /* increase the refcount again, because we are * returning it to the user */ git_cached_obj_incref(entry);
* oid: Explicitly include `oid.h` for the inlined CMPVicent Marti2012-08-091-0/+1
|
* misc: Fix warnings from PVS Studio trialVicent Martí2012-06-071-1/+1
|
* Moving power-of-two bit utilities into util.hRussell Belfer2012-04-251-9/+2
|
* Convert attr, ignore, mwindow, status to new errorsRussell Belfer2012-03-161-3/+2
| | | | | Also cleaned up some previously converted code that still had little things to polish.
* Update Copyright headerschu2012-02-131-1/+1
| | | | Signed-off-by: schu <schu-github@schulog.org>
* cache: Simplify locking mechanicsVicent Martí2012-01-271-38/+34
| | | | | The object cache is mostly IO-bound, so it makes no sense to have a lock per node.
* global: Properly use `git__` memory wrappersVicent Marti2011-10-281-1/+1
| | | | | Ensure that all memory related functions (malloc, calloc, strdup, free, etc) are using their respective `git__` wrappers.
* Merge pull request #384 from kiryl/warningsVicent Martí2011-09-181-6/+6
|\ | | | | Add more -W flags to CFLAGS
| * CMakefile: add -Wstrict-aliasing=2 and fix warningsKirill A. Shutemov2011-08-301-6/+6
| | | | | | | | Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
* | Cleanup legal dataVicent Marti2011-09-191-21/+3
|/ | | | | | | | | | 1. The license header is technically not valid if it doesn't have a copyright signature. 2. The COPYING file has been updated with the different licenses used in the project. 3. The full GPLv2 header in each file annoys me.
* cache: Drop cuckoo hashingVicent Marti2011-05-171-66/+22
| | | | | | | | Now we use a simple closed-addressing cache. Cuckoo hashing was creating too many issues with race conditions. Fuck that. Let's see what happens performance wise, we may have to roll back or come up with another way to implement an efficient multi-threaded cache.
* cache: Fix deadlockVicent Marti2011-05-171-6/+14
| | | | | Do not try to adquire the same node lock twice when the cuckoo hashing resolves to the same node.
* Return success code on `git_cache_init`Vicent Marti2011-05-151-0/+2
|
* Move cache.c to the new error handlingnulltoken2011-05-151-2/+4
|
* Move repository.c to the new error handlingnulltoken2011-05-141-1/+1
|
* Fix MSVC warningsVicent Marti2011-03-211-1/+1
|
* I broke your bindingsVicent Marti2011-03-201-30/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Hey. Apologies in advance -- I broke your bindings. This is a major commit that includes a long-overdue redesign of the whole object-database structure. This is expected to be the last major external API redesign of the library until the first non-alpha release. Please get your bindings up to date with these changes. They will be included in the next minor release. Sorry again! Major features include: - Real caching and refcounting on parsed objects - Real caching and refcounting on objects read from the ODB - Streaming writes & reads from the ODB - Single-method writes for all object types - The external API is now partially thread-safe The speed increases are significant in all aspects, specially when reading an object several times from the ODB (revwalking) and when writing big objects to the ODB. Here's a full changelog for the external API: blob.h ------ - Remove `git_blob_new` - Remove `git_blob_set_rawcontent` - Remove `git_blob_set_rawcontent_fromfile` - Rename `git_blob_writefile` -> `git_blob_create_fromfile` - Change `git_blob_create_fromfile`: The `path` argument is now relative to the repository's working dir - Add `git_blob_create_frombuffer` commit.h -------- - Remove `git_commit_new` - Remove `git_commit_add_parent` - Remove `git_commit_set_message` - Remove `git_commit_set_committer` - Remove `git_commit_set_author` - Remove `git_commit_set_tree` - Add `git_commit_create` - Add `git_commit_create_v` - Add `git_commit_create_o` - Add `git_commit_create_ov` tag.h ----- - Remove `git_tag_new` - Remove `git_tag_set_target` - Remove `git_tag_set_name` - Remove `git_tag_set_tagger` - Remove `git_tag_set_message` - Add `git_tag_create` - Add `git_tag_create_o` tree.h ------ - Change `git_tree_entry_2object`: New signature is `(git_object **object_out, git_repository *repo, git_tree_entry *entry)` - Remove `git_tree_new` - Remove `git_tree_add_entry` - Remove `git_tree_remove_entry_byindex` - Remove `git_tree_remove_entry_byname` - Remove `git_tree_clearentries` - Remove `git_tree_entry_set_id` - Remove `git_tree_entry_set_name` - Remove `git_tree_entry_set_attributes` object.h ------------ - Remove `git_object_new - Remove `git_object_write` - Change `git_object_close`: This method is now *mandatory*. Not closing an object causes a memory leak. odb.h ----- - Remove type `git_rawobj` - Remove `git_rawobj_close` - Rename `git_rawobj_hash` -> `git_odb_hash` - Change `git_odb_hash`: New signature is `(git_oid *id, const void *data, size_t len, git_otype type)` - Add type `git_odb_object` - Add `git_odb_object_close` - Change `git_odb_read`: New signature is `(git_odb_object **out, git_odb *db, const git_oid *id)` - Change `git_odb_read_header`: New signature is `(size_t *len_p, git_otype *type_p, git_odb *db, const git_oid *id)` - Remove `git_odb_write` - Add `git_odb_open_wstream` - Add `git_odb_open_rstream` odb_backend.h ------------- - Change type `git_odb_backend`: New internal signatures are as follows int (* read)(void **, size_t *, git_otype *, struct git_odb_backend *, const git_oid *) int (* read_header)(size_t *, git_otype *, struct git_odb_backend *, const git_oid *) int (* writestream)(struct git_odb_stream **, struct git_odb_backend *, size_t, git_otype) int (* readstream)( struct git_odb_stream **, struct git_odb_backend *, const git_oid *) - Add type `git_odb_stream` - Add enum `git_odb_streammode` Signed-off-by: Vicent Marti <tanoku@gmail.com>
* Thread safe cacheVicent Marti2011-03-201-0/+175