summaryrefslogtreecommitdiffstats
path: root/test/unit/witness.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2016-05-11 05:21:10 (GMT)
committerJason Evans <jasone@canonware.com>2016-05-11 05:51:33 (GMT)
commitc1e00ef2a6442d1d047950247c757821560db329 (patch)
tree9b0f1d42e7f35d431b8110baf69ba9a612bfb27b /test/unit/witness.c
parent0c12dcabc59ea9c95fc38197e7c4bc44663b0a26 (diff)
downloadjemalloc-c1e00ef2a6442d1d047950247c757821560db329.zip
jemalloc-c1e00ef2a6442d1d047950247c757821560db329.tar.gz
jemalloc-c1e00ef2a6442d1d047950247c757821560db329.tar.bz2
Resolve bootstrapping issues when embedded in FreeBSD libc.
b2c0d6322d2307458ae2b28545f8a5c9903d7ef5 (Add witness, a simple online locking validator.) caused a broad propagation of tsd throughout the internal API, but tsd_fetch() was designed to fail prior to tsd bootstrapping. Fix this by splitting tsd_t into non-nullable tsd_t and nullable tsdn_t, and modifying all internal APIs that do not critically rely on tsd to take nullable pointers. Furthermore, add the tsd_booted_get() function so that tsdn_fetch() can probe whether tsd bootstrapping is complete and return NULL if not. All dangerous conversions of nullable pointers are tsdn_tsd() calls that assert-fail on invalid conversion.
Diffstat (limited to 'test/unit/witness.c')
-rw-r--r--test/unit/witness.c116
1 files changed, 58 insertions, 58 deletions
diff --git a/test/unit/witness.c b/test/unit/witness.c
index 430d820..ed17275 100644
--- a/test/unit/witness.c
+++ b/test/unit/witness.c
@@ -60,76 +60,76 @@ witness_comp_reverse(const witness_t *a, const witness_t *b)
TEST_BEGIN(test_witness)
{
witness_t a, b;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, NULL);
- witness_assert_not_owner(tsd, &a);
- witness_lock(tsd, &a);
- witness_assert_owner(tsd, &a);
+ witness_assert_not_owner(tsdn, &a);
+ witness_lock(tsdn, &a);
+ witness_assert_owner(tsdn, &a);
witness_init(&b, "b", 2, NULL);
- witness_assert_not_owner(tsd, &b);
- witness_lock(tsd, &b);
- witness_assert_owner(tsd, &b);
+ witness_assert_not_owner(tsdn, &b);
+ witness_lock(tsdn, &b);
+ witness_assert_owner(tsdn, &b);
- witness_unlock(tsd, &a);
- witness_unlock(tsd, &b);
+ witness_unlock(tsdn, &a);
+ witness_unlock(tsdn, &b);
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
}
TEST_END
TEST_BEGIN(test_witness_comp)
{
witness_t a, b, c, d;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, witness_comp);
- witness_assert_not_owner(tsd, &a);
- witness_lock(tsd, &a);
- witness_assert_owner(tsd, &a);
+ witness_assert_not_owner(tsdn, &a);
+ witness_lock(tsdn, &a);
+ witness_assert_owner(tsdn, &a);
witness_init(&b, "b", 1, witness_comp);
- witness_assert_not_owner(tsd, &b);
- witness_lock(tsd, &b);
- witness_assert_owner(tsd, &b);
- witness_unlock(tsd, &b);
+ witness_assert_not_owner(tsdn, &b);
+ witness_lock(tsdn, &b);
+ witness_assert_owner(tsdn, &b);
+ witness_unlock(tsdn, &b);
witness_lock_error_orig = witness_lock_error;
witness_lock_error = witness_lock_error_intercept;
saw_lock_error = false;
witness_init(&c, "c", 1, witness_comp_reverse);
- witness_assert_not_owner(tsd, &c);
+ witness_assert_not_owner(tsdn, &c);
assert_false(saw_lock_error, "Unexpected witness lock error");
- witness_lock(tsd, &c);
+ witness_lock(tsdn, &c);
assert_true(saw_lock_error, "Expected witness lock error");
- witness_unlock(tsd, &c);
+ witness_unlock(tsdn, &c);
saw_lock_error = false;
witness_init(&d, "d", 1, NULL);
- witness_assert_not_owner(tsd, &d);
+ witness_assert_not_owner(tsdn, &d);
assert_false(saw_lock_error, "Unexpected witness lock error");
- witness_lock(tsd, &d);
+ witness_lock(tsdn, &d);
assert_true(saw_lock_error, "Expected witness lock error");
- witness_unlock(tsd, &d);
+ witness_unlock(tsdn, &d);
- witness_unlock(tsd, &a);
+ witness_unlock(tsdn, &a);
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_lock_error = witness_lock_error_orig;
}
@@ -138,7 +138,7 @@ TEST_END
TEST_BEGIN(test_witness_reversal)
{
witness_t a, b;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
@@ -146,22 +146,22 @@ TEST_BEGIN(test_witness_reversal)
witness_lock_error = witness_lock_error_intercept;
saw_lock_error = false;
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, NULL);
witness_init(&b, "b", 2, NULL);
- witness_lock(tsd, &b);
+ witness_lock(tsdn, &b);
assert_false(saw_lock_error, "Unexpected witness lock error");
- witness_lock(tsd, &a);
+ witness_lock(tsdn, &a);
assert_true(saw_lock_error, "Expected witness lock error");
- witness_unlock(tsd, &a);
- witness_unlock(tsd, &b);
+ witness_unlock(tsdn, &a);
+ witness_unlock(tsdn, &b);
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_lock_error = witness_lock_error_orig;
}
@@ -170,7 +170,7 @@ TEST_END
TEST_BEGIN(test_witness_recursive)
{
witness_t a;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
@@ -182,22 +182,22 @@ TEST_BEGIN(test_witness_recursive)
witness_lock_error = witness_lock_error_intercept;
saw_lock_error = false;
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, NULL);
- witness_lock(tsd, &a);
+ witness_lock(tsdn, &a);
assert_false(saw_lock_error, "Unexpected witness lock error");
assert_false(saw_not_owner_error, "Unexpected witness not owner error");
- witness_lock(tsd, &a);
+ witness_lock(tsdn, &a);
assert_true(saw_lock_error, "Expected witness lock error");
assert_true(saw_not_owner_error, "Expected witness not owner error");
- witness_unlock(tsd, &a);
+ witness_unlock(tsdn, &a);
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_owner_error = witness_owner_error_orig;
witness_lock_error = witness_lock_error_orig;
@@ -208,7 +208,7 @@ TEST_END
TEST_BEGIN(test_witness_unlock_not_owned)
{
witness_t a;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
@@ -216,17 +216,17 @@ TEST_BEGIN(test_witness_unlock_not_owned)
witness_owner_error = witness_owner_error_intercept;
saw_owner_error = false;
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, NULL);
assert_false(saw_owner_error, "Unexpected owner error");
- witness_unlock(tsd, &a);
+ witness_unlock(tsdn, &a);
assert_true(saw_owner_error, "Expected owner error");
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_owner_error = witness_owner_error_orig;
}
@@ -235,7 +235,7 @@ TEST_END
TEST_BEGIN(test_witness_lockful)
{
witness_t a;
- tsd_t *tsd;
+ tsdn_t *tsdn;
test_skip_if(!config_debug);
@@ -243,22 +243,22 @@ TEST_BEGIN(test_witness_lockful)
witness_lockless_error = witness_lockless_error_intercept;
saw_lockless_error = false;
- tsd = tsd_fetch();
+ tsdn = tsdn_fetch();
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_init(&a, "a", 1, NULL);
assert_false(saw_lockless_error, "Unexpected lockless error");
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
- witness_lock(tsd, &a);
- witness_assert_lockless(tsd);
+ witness_lock(tsdn, &a);
+ witness_assert_lockless(tsdn);
assert_true(saw_lockless_error, "Expected lockless error");
- witness_unlock(tsd, &a);
+ witness_unlock(tsdn, &a);
- witness_assert_lockless(tsd);
+ witness_assert_lockless(tsdn);
witness_lockless_error = witness_lockless_error_orig;
}