Jason Evans | 86abd0d | 2013-11-30 15:25:42 -0800 | [diff] [blame] | 1 | #include "test/jemalloc_test.h" |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 2 | |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 3 | static const bool config_stats = |
| 4 | #ifdef JEMALLOC_STATS |
| 5 | true |
| 6 | #else |
| 7 | false |
| 8 | #endif |
| 9 | ; |
| 10 | |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 11 | void * |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 12 | thd_start(void *arg) |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 13 | { |
| 14 | int err; |
| 15 | void *p; |
| 16 | uint64_t a0, a1, d0, d1; |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 17 | uint64_t *ap0, *ap1, *dp0, *dp1; |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 18 | size_t sz, usize; |
| 19 | |
| 20 | sz = sizeof(a0); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 21 | if ((err = mallctl("thread.allocated", &a0, &sz, NULL, 0))) { |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 22 | if (err == ENOENT) |
| 23 | goto label_ENOENT; |
| 24 | test_fail("%s(): Error in mallctl(): %s", __func__, |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 25 | strerror(err)); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 26 | } |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 27 | sz = sizeof(ap0); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 28 | if ((err = mallctl("thread.allocatedp", &ap0, &sz, NULL, 0))) { |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 29 | if (err == ENOENT) |
| 30 | goto label_ENOENT; |
| 31 | test_fail("%s(): Error in mallctl(): %s", __func__, |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 32 | strerror(err)); |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 33 | } |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 34 | assert_u64_eq(*ap0, a0, |
| 35 | "\"thread.allocatedp\" should provide a pointer to internal " |
| 36 | "storage"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 37 | |
| 38 | sz = sizeof(d0); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 39 | if ((err = mallctl("thread.deallocated", &d0, &sz, NULL, 0))) { |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 40 | if (err == ENOENT) |
| 41 | goto label_ENOENT; |
| 42 | test_fail("%s(): Error in mallctl(): %s", __func__, |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 43 | strerror(err)); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 44 | } |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 45 | sz = sizeof(dp0); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 46 | if ((err = mallctl("thread.deallocatedp", &dp0, &sz, NULL, 0))) { |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 47 | if (err == ENOENT) |
| 48 | goto label_ENOENT; |
| 49 | test_fail("%s(): Error in mallctl(): %s", __func__, |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 50 | strerror(err)); |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 51 | } |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 52 | assert_u64_eq(*dp0, d0, |
| 53 | "\"thread.deallocatedp\" should provide a pointer to internal " |
| 54 | "storage"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 55 | |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 56 | p = malloc(1); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 57 | assert_ptr_not_null(p, "Unexpected malloc() error"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 58 | |
| 59 | sz = sizeof(a1); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 60 | mallctl("thread.allocated", &a1, &sz, NULL, 0); |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 61 | sz = sizeof(ap1); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 62 | mallctl("thread.allocatedp", &ap1, &sz, NULL, 0); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 63 | assert_u64_eq(*ap1, a1, |
| 64 | "Dereferenced \"thread.allocatedp\" value should equal " |
| 65 | "\"thread.allocated\" value"); |
| 66 | assert_ptr_eq(ap0, ap1, |
| 67 | "Pointer returned by \"thread.allocatedp\" should not change"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 68 | |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 69 | usize = malloc_usable_size(p); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 70 | assert_u64_le(a0 + usize, a1, |
| 71 | "Allocated memory counter should increase by at least the amount " |
| 72 | "explicitly allocated"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 73 | |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 74 | free(p); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 75 | |
| 76 | sz = sizeof(d1); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 77 | mallctl("thread.deallocated", &d1, &sz, NULL, 0); |
Jason Evans | 9dcad2d | 2011-02-13 18:11:54 -0800 | [diff] [blame] | 78 | sz = sizeof(dp1); |
Jason Evans | 0a5489e | 2012-03-01 17:19:20 -0800 | [diff] [blame] | 79 | mallctl("thread.deallocatedp", &dp1, &sz, NULL, 0); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 80 | assert_u64_eq(*dp1, d1, |
| 81 | "Dereferenced \"thread.deallocatedp\" value should equal " |
| 82 | "\"thread.deallocated\" value"); |
| 83 | assert_ptr_eq(dp0, dp1, |
| 84 | "Pointer returned by \"thread.deallocatedp\" should not change"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 85 | |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 86 | assert_u64_le(d0 + usize, d1, |
| 87 | "Deallocated memory counter should increase by at least the amount " |
| 88 | "explicitly deallocated"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 89 | |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 90 | return (NULL); |
| 91 | label_ENOENT: |
| 92 | assert_false(config_stats, |
| 93 | "ENOENT should only be returned if stats are disabled"); |
| 94 | test_skip("\"thread.allocated\" mallctl not available"); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 95 | return (NULL); |
| 96 | } |
| 97 | |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 98 | TEST_BEGIN(test_main_thread) |
| 99 | { |
| 100 | |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 101 | thd_start(NULL); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 102 | } |
| 103 | TEST_END |
| 104 | |
| 105 | TEST_BEGIN(test_subthread) |
| 106 | { |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 107 | thd_t thd; |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 108 | |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 109 | thd_create(&thd, thd_start, NULL); |
| 110 | thd_join(thd, NULL); |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 111 | } |
| 112 | TEST_END |
| 113 | |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 114 | int |
| 115 | main(void) |
| 116 | { |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 117 | |
Jason Evans | 2a83ed0 | 2013-12-08 20:52:21 -0800 | [diff] [blame] | 118 | /* Run tests multiple times to check for bad interactions. */ |
| 119 | return (test( |
| 120 | test_main_thread, |
| 121 | test_subthread, |
| 122 | test_main_thread, |
| 123 | test_subthread, |
| 124 | test_main_thread)); |
Jason Evans | 9344368 | 2010-10-20 17:39:18 -0700 | [diff] [blame] | 125 | } |