Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2014-04-11 09:31:01 +0400
committerRussell Belfer <rb@github.com>2014-04-18 01:56:41 +0400
commit7d4908724fd7d4d8e096b4faf2c652ba5b77644e (patch)
tree2fcd09e7e040607c124f6e658c31f33e1aa1868a /tests/threads
parent1fa17b5c92cb92a2785fba403b87525169b205c0 (diff)
Attribute file cache refactor
This is a big refactoring of the attribute file cache to be a bit simpler which in turn makes it easier to enforce a lock around any updates to the cache so that it can be used in a threaded env. Tons of changes to the attributes and ignores code.
Diffstat (limited to 'tests/threads')
-rw-r--r--tests/threads/diff.c49
-rw-r--r--tests/threads/iterator.c49
-rw-r--r--tests/threads/thread_helpers.c44
-rw-r--r--tests/threads/thread_helpers.h8
4 files changed, 106 insertions, 44 deletions
diff --git a/tests/threads/diff.c b/tests/threads/diff.c
index 5565c4bf1..562eec71c 100644
--- a/tests/threads/diff.c
+++ b/tests/threads/diff.c
@@ -1,59 +1,22 @@
#include "clar_libgit2.h"
-#include "thread-utils.h"
+#include "thread_helpers.h"
static git_repository *_repo;
static git_tree *_a, *_b;
static git_atomic _counts[4];
static int _check_counts;
+#define THREADS 20
+
void test_threads_diff__cleanup(void)
{
cl_git_sandbox_cleanup();
}
-static void run_in_parallel(
- int repeats, int threads, void *(*func)(void *),
- void (*before_test)(void), void (*after_test)(void))
-{
- int r, t, *id = git__calloc(threads, sizeof(int));
-#ifdef GIT_THREADS
- git_thread *th = git__calloc(threads, sizeof(git_thread));
- cl_assert(th != NULL);
-#else
- void *th = NULL;
-#endif
-
- cl_assert(id != NULL);
-
- for (r = 0; r < repeats; ++r) {
- _repo = cl_git_sandbox_reopen(); /* reopen sandbox to flush caches */
-
- if (before_test) before_test();
-
- for (t = 0; t < threads; ++t) {
- id[t] = t;
-#ifdef GIT_THREADS
- cl_git_pass(git_thread_create(&th[t], NULL, func, &id[t]));
-#else
- cl_assert(func(&id[t]) == &id[t]);
-#endif
- }
-
-#ifdef GIT_THREADS
- for (t = 0; t < threads; ++t)
- cl_git_pass(git_thread_join(th[t], NULL));
- memset(th, 0, threads * sizeof(git_thread));
-#endif
-
- if (after_test) after_test();
- }
-
- git__free(id);
- git__free(th);
-}
-
static void setup_trees(void)
{
+ _repo = cl_git_sandbox_reopen(); /* reopen sandbox to flush caches */
+
cl_git_pass(git_revparse_single(
(git_object **)&_a, _repo, "0017bd4ab1^{tree}"));
cl_git_pass(git_revparse_single(
@@ -62,8 +25,6 @@ static void setup_trees(void)
memset(_counts, 0, sizeof(_counts));
}
-#define THREADS 20
-
static void free_trees(void)
{
git_tree_free(_a); _a = NULL;
diff --git a/tests/threads/iterator.c b/tests/threads/iterator.c
new file mode 100644
index 000000000..4dd251fa5
--- /dev/null
+++ b/tests/threads/iterator.c
@@ -0,0 +1,49 @@
+#include "clar_libgit2.h"
+#include "thread_helpers.h"
+#include "iterator.h"
+
+static git_repository *_repo;
+
+void test_threads_iterator__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+static void *run_workdir_iterator(void *arg)
+{
+ int error = 0, thread = *(int *)arg;
+ git_iterator *iter;
+ const git_index_entry *entry = NULL;
+
+ cl_git_pass(git_iterator_for_workdir(
+ &iter, _repo, GIT_ITERATOR_DONT_AUTOEXPAND, NULL, NULL));
+
+ while (!error) {
+ if (entry && entry->mode == GIT_FILEMODE_TREE) {
+ error = git_iterator_advance_into(&entry, iter);
+
+ if (error == GIT_ENOTFOUND)
+ error = git_iterator_advance(&entry, iter);
+ } else {
+ error = git_iterator_advance(&entry, iter);
+ }
+
+ if (!error)
+ (void)git_iterator_current_is_ignored(iter);
+ }
+
+ cl_assert_equal_i(GIT_ITEROVER, error);
+
+ git_iterator_free(iter);
+
+ return arg;
+}
+
+
+void test_threads_iterator__workdir(void)
+{
+ _repo = cl_git_sandbox_init("status");
+
+ run_in_parallel(
+ 1, 20, run_workdir_iterator, NULL, NULL);
+}
diff --git a/tests/threads/thread_helpers.c b/tests/threads/thread_helpers.c
new file mode 100644
index 000000000..25370dddb
--- /dev/null
+++ b/tests/threads/thread_helpers.c
@@ -0,0 +1,44 @@
+#include "clar_libgit2.h"
+#include "thread_helpers.h"
+
+void run_in_parallel(
+ int repeats,
+ int threads,
+ void *(*func)(void *),
+ void (*before_test)(void),
+ void (*after_test)(void))
+{
+ int r, t, *id = git__calloc(threads, sizeof(int));
+#ifdef GIT_THREADS
+ git_thread *th = git__calloc(threads, sizeof(git_thread));
+ cl_assert(th != NULL);
+#else
+ void *th = NULL;
+#endif
+
+ cl_assert(id != NULL);
+
+ for (r = 0; r < repeats; ++r) {
+ if (before_test) before_test();
+
+ for (t = 0; t < threads; ++t) {
+ id[t] = t;
+#ifdef GIT_THREADS
+ cl_git_pass(git_thread_create(&th[t], NULL, func, &id[t]));
+#else
+ cl_assert(func(&id[t]) == &id[t]);
+#endif
+ }
+
+#ifdef GIT_THREADS
+ for (t = 0; t < threads; ++t)
+ cl_git_pass(git_thread_join(th[t], NULL));
+ memset(th, 0, threads * sizeof(git_thread));
+#endif
+
+ if (after_test) after_test();
+ }
+
+ git__free(id);
+ git__free(th);
+}
diff --git a/tests/threads/thread_helpers.h b/tests/threads/thread_helpers.h
new file mode 100644
index 000000000..3c13cfb6b
--- /dev/null
+++ b/tests/threads/thread_helpers.h
@@ -0,0 +1,8 @@
+#include "thread-utils.h"
+
+void run_in_parallel(
+ int repeats,
+ int threads,
+ void *(*func)(void *),
+ void (*before_test)(void),
+ void (*after_test)(void));