Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more
This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.
Note, you must import this library with import name: events!!!
TESTS/mbed_drivers/stats/main.cpp@7514:a0c71f3f3d2f, 2016-08-13 (annotated)
- Committer:
- Russ Butler
- Date:
- Sat Aug 13 17:12:03 2016 -0500
- Revision:
- 7514:a0c71f3f3d2f
Heap statistics
Keep track of the current size allocated, maximum size allocated,
number of allocations, failed allocations and total size allocated for
both GCC and ARM. Report the maximum size allocated at the end of
testing.
Also, add a test to verify heap metrics are working as expected.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Russ Butler |
7514:a0c71f3f3d2f | 1 | /* |
| Russ Butler |
7514:a0c71f3f3d2f | 2 | * Copyright (c) 2013-2016, ARM Limited, All Rights Reserved |
| Russ Butler |
7514:a0c71f3f3d2f | 3 | * SPDX-License-Identifier: Apache-2.0 |
| Russ Butler |
7514:a0c71f3f3d2f | 4 | * |
| Russ Butler |
7514:a0c71f3f3d2f | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
| Russ Butler |
7514:a0c71f3f3d2f | 6 | * not use this file except in compliance with the License. |
| Russ Butler |
7514:a0c71f3f3d2f | 7 | * You may obtain a copy of the License at |
| Russ Butler |
7514:a0c71f3f3d2f | 8 | * |
| Russ Butler |
7514:a0c71f3f3d2f | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| Russ Butler |
7514:a0c71f3f3d2f | 10 | * |
| Russ Butler |
7514:a0c71f3f3d2f | 11 | * Unless required by applicable law or agreed to in writing, software |
| Russ Butler |
7514:a0c71f3f3d2f | 12 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| Russ Butler |
7514:a0c71f3f3d2f | 13 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| Russ Butler |
7514:a0c71f3f3d2f | 14 | * See the License for the specific language governing permissions and |
| Russ Butler |
7514:a0c71f3f3d2f | 15 | * limitations under the License. |
| Russ Butler |
7514:a0c71f3f3d2f | 16 | */ |
| Russ Butler |
7514:a0c71f3f3d2f | 17 | #include "mbed.h" |
| Russ Butler |
7514:a0c71f3f3d2f | 18 | #include "greentea-client/test_env.h" |
| Russ Butler |
7514:a0c71f3f3d2f | 19 | #include "unity/unity.h" |
| Russ Butler |
7514:a0c71f3f3d2f | 20 | #include "utest/utest.h" |
| Russ Butler |
7514:a0c71f3f3d2f | 21 | #include "mbed_stats.h" |
| Russ Butler |
7514:a0c71f3f3d2f | 22 | #include <stdlib.h> |
| Russ Butler |
7514:a0c71f3f3d2f | 23 | #include <stdio.h> |
| Russ Butler |
7514:a0c71f3f3d2f | 24 | |
| Russ Butler |
7514:a0c71f3f3d2f | 25 | #if !defined(MBED_HEAP_STATS_ENABLED) || !MBED_HEAP_STATS_ENABLED || defined(__ICCARM__) |
| Russ Butler |
7514:a0c71f3f3d2f | 26 | #error [NOT_SUPPORTED] test not supported |
| Russ Butler |
7514:a0c71f3f3d2f | 27 | #endif |
| Russ Butler |
7514:a0c71f3f3d2f | 28 | |
| Russ Butler |
7514:a0c71f3f3d2f | 29 | using namespace utest::v1; |
| Russ Butler |
7514:a0c71f3f3d2f | 30 | |
| Russ Butler |
7514:a0c71f3f3d2f | 31 | #define ALLOCATION_SIZE_DEFAULT 564 |
| Russ Butler |
7514:a0c71f3f3d2f | 32 | #define ALLOCATION_SIZE_SMALL 124 |
| Russ Butler |
7514:a0c71f3f3d2f | 33 | #define ALLOCATION_SIZE_LARGE 790 |
| Russ Butler |
7514:a0c71f3f3d2f | 34 | #define ALLOCATION_SIZE_FAIL (1024 * 1024 *1024) |
| Russ Butler |
7514:a0c71f3f3d2f | 35 | |
| Russ Butler |
7514:a0c71f3f3d2f | 36 | typedef void* (*malloc_cb_t) (uint32_t size); |
| Russ Butler |
7514:a0c71f3f3d2f | 37 | |
| Russ Butler |
7514:a0c71f3f3d2f | 38 | static void* thunk_malloc(uint32_t size); |
| Russ Butler |
7514:a0c71f3f3d2f | 39 | static void* thunk_calloc_1(uint32_t size); |
| Russ Butler |
7514:a0c71f3f3d2f | 40 | static void* thunk_calloc_4(uint32_t size); |
| Russ Butler |
7514:a0c71f3f3d2f | 41 | static void* thunk_realloc(uint32_t size); |
| Russ Butler |
7514:a0c71f3f3d2f | 42 | |
| Russ Butler |
7514:a0c71f3f3d2f | 43 | malloc_cb_t malloc_thunk_array[] = { |
| Russ Butler |
7514:a0c71f3f3d2f | 44 | thunk_malloc, |
| Russ Butler |
7514:a0c71f3f3d2f | 45 | thunk_calloc_1, |
| Russ Butler |
7514:a0c71f3f3d2f | 46 | thunk_calloc_4, |
| Russ Butler |
7514:a0c71f3f3d2f | 47 | thunk_realloc, |
| Russ Butler |
7514:a0c71f3f3d2f | 48 | }; |
| Russ Butler |
7514:a0c71f3f3d2f | 49 | |
| Russ Butler |
7514:a0c71f3f3d2f | 50 | void test_case_malloc_free_size() |
| Russ Butler |
7514:a0c71f3f3d2f | 51 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 52 | printf("Initial print to setup stdio buffers\n"); |
| Russ Butler |
7514:a0c71f3f3d2f | 53 | mbed_stats_heap_t stats_start; |
| Russ Butler |
7514:a0c71f3f3d2f | 54 | mbed_stats_heap_t stats_current; |
| Russ Butler |
7514:a0c71f3f3d2f | 55 | void *data; |
| Russ Butler |
7514:a0c71f3f3d2f | 56 | |
| Russ Butler |
7514:a0c71f3f3d2f | 57 | mbed_stats_heap_get(&stats_start); |
| Russ Butler |
7514:a0c71f3f3d2f | 58 | |
| Russ Butler |
7514:a0c71f3f3d2f | 59 | for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) { |
| Russ Butler |
7514:a0c71f3f3d2f | 60 | |
| Russ Butler |
7514:a0c71f3f3d2f | 61 | // Allocate memory and assert size change |
| Russ Butler |
7514:a0c71f3f3d2f | 62 | data = malloc_thunk_array[i](ALLOCATION_SIZE_DEFAULT); |
| Russ Butler |
7514:a0c71f3f3d2f | 63 | TEST_ASSERT(data != NULL); |
| Russ Butler |
7514:a0c71f3f3d2f | 64 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 65 | uint32_t increase = stats_current.current_size - stats_start.current_size; |
| Russ Butler |
7514:a0c71f3f3d2f | 66 | TEST_ASSERT_EQUAL_UINT32(ALLOCATION_SIZE_DEFAULT, increase); |
| Russ Butler |
7514:a0c71f3f3d2f | 67 | TEST_ASSERT_EQUAL_UINT32(stats_start.total_size + ALLOCATION_SIZE_DEFAULT * (i + 1), stats_current.total_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 68 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt + 1, stats_current.alloc_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 69 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 70 | |
| Russ Butler |
7514:a0c71f3f3d2f | 71 | // Free memory and assert back to starting size |
| Russ Butler |
7514:a0c71f3f3d2f | 72 | free(data); |
| Russ Butler |
7514:a0c71f3f3d2f | 73 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 74 | TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 75 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 76 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 77 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 78 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 79 | |
| Russ Butler |
7514:a0c71f3f3d2f | 80 | void test_case_allocate_zero() |
| Russ Butler |
7514:a0c71f3f3d2f | 81 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 82 | mbed_stats_heap_t stats_start; |
| Russ Butler |
7514:a0c71f3f3d2f | 83 | mbed_stats_heap_t stats_current; |
| Russ Butler |
7514:a0c71f3f3d2f | 84 | void *data; |
| Russ Butler |
7514:a0c71f3f3d2f | 85 | |
| Russ Butler |
7514:a0c71f3f3d2f | 86 | mbed_stats_heap_get(&stats_start); |
| Russ Butler |
7514:a0c71f3f3d2f | 87 | |
| Russ Butler |
7514:a0c71f3f3d2f | 88 | for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) { |
| Russ Butler |
7514:a0c71f3f3d2f | 89 | |
| Russ Butler |
7514:a0c71f3f3d2f | 90 | // Allocate memory and assert size change |
| Russ Butler |
7514:a0c71f3f3d2f | 91 | data = malloc_thunk_array[i](0); |
| Russ Butler |
7514:a0c71f3f3d2f | 92 | // Return can be NULL |
| Russ Butler |
7514:a0c71f3f3d2f | 93 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 94 | TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 95 | TEST_ASSERT_EQUAL_UINT32(stats_start.total_size, stats_current.total_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 96 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 97 | |
| Russ Butler |
7514:a0c71f3f3d2f | 98 | // Free memory and assert back to starting size |
| Russ Butler |
7514:a0c71f3f3d2f | 99 | free(data); |
| Russ Butler |
7514:a0c71f3f3d2f | 100 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 101 | TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 102 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 103 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt, stats_current.alloc_fail_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 104 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 105 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 106 | |
| Russ Butler |
7514:a0c71f3f3d2f | 107 | void test_case_allocate_fail() |
| Russ Butler |
7514:a0c71f3f3d2f | 108 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 109 | mbed_stats_heap_t stats_start; |
| Russ Butler |
7514:a0c71f3f3d2f | 110 | mbed_stats_heap_t stats_current; |
| Russ Butler |
7514:a0c71f3f3d2f | 111 | void *data; |
| Russ Butler |
7514:a0c71f3f3d2f | 112 | |
| Russ Butler |
7514:a0c71f3f3d2f | 113 | mbed_stats_heap_get(&stats_start); |
| Russ Butler |
7514:a0c71f3f3d2f | 114 | |
| Russ Butler |
7514:a0c71f3f3d2f | 115 | for (uint32_t i = 0; i < sizeof(malloc_thunk_array) / sizeof(malloc_cb_t); i++) { |
| Russ Butler |
7514:a0c71f3f3d2f | 116 | |
| Russ Butler |
7514:a0c71f3f3d2f | 117 | // Trigger a failure by trying to allocate a buffer that won't fit |
| Russ Butler |
7514:a0c71f3f3d2f | 118 | data = malloc_thunk_array[i](ALLOCATION_SIZE_FAIL); |
| Russ Butler |
7514:a0c71f3f3d2f | 119 | TEST_ASSERT(data == NULL); |
| Russ Butler |
7514:a0c71f3f3d2f | 120 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 121 | TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 122 | TEST_ASSERT_EQUAL_UINT32(stats_start.total_size, stats_current.total_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 123 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_cnt, stats_current.alloc_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 124 | TEST_ASSERT_EQUAL_UINT32(stats_start.alloc_fail_cnt + i + 1, stats_current.alloc_fail_cnt); |
| Russ Butler |
7514:a0c71f3f3d2f | 125 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 126 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 127 | |
| Russ Butler |
7514:a0c71f3f3d2f | 128 | static void* thunk_malloc(uint32_t size) |
| Russ Butler |
7514:a0c71f3f3d2f | 129 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 130 | printf("Malloc thunk\n"); |
| Russ Butler |
7514:a0c71f3f3d2f | 131 | return malloc(size); |
| Russ Butler |
7514:a0c71f3f3d2f | 132 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 133 | |
| Russ Butler |
7514:a0c71f3f3d2f | 134 | static void* thunk_calloc_1(uint32_t size) |
| Russ Butler |
7514:a0c71f3f3d2f | 135 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 136 | printf("Calloc thunk 1 byte\n"); |
| Russ Butler |
7514:a0c71f3f3d2f | 137 | return calloc(size / 1, 1); |
| Russ Butler |
7514:a0c71f3f3d2f | 138 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 139 | |
| Russ Butler |
7514:a0c71f3f3d2f | 140 | static void* thunk_calloc_4(uint32_t size) |
| Russ Butler |
7514:a0c71f3f3d2f | 141 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 142 | printf("Calloc thunk 4 bytes\n"); |
| Russ Butler |
7514:a0c71f3f3d2f | 143 | return calloc(size / 4, 4); |
| Russ Butler |
7514:a0c71f3f3d2f | 144 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 145 | |
| Russ Butler |
7514:a0c71f3f3d2f | 146 | |
| Russ Butler |
7514:a0c71f3f3d2f | 147 | static void* thunk_realloc(uint32_t size) |
| Russ Butler |
7514:a0c71f3f3d2f | 148 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 149 | printf("Realloc thunk\n"); |
| Russ Butler |
7514:a0c71f3f3d2f | 150 | return realloc(NULL, size); |
| Russ Butler |
7514:a0c71f3f3d2f | 151 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 152 | |
| Russ Butler |
7514:a0c71f3f3d2f | 153 | void test_case_realloc_size() |
| Russ Butler |
7514:a0c71f3f3d2f | 154 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 155 | mbed_stats_heap_t stats_start; |
| Russ Butler |
7514:a0c71f3f3d2f | 156 | mbed_stats_heap_t stats_current; |
| Russ Butler |
7514:a0c71f3f3d2f | 157 | uint32_t increase; |
| Russ Butler |
7514:a0c71f3f3d2f | 158 | void *data; |
| Russ Butler |
7514:a0c71f3f3d2f | 159 | |
| Russ Butler |
7514:a0c71f3f3d2f | 160 | mbed_stats_heap_get(&stats_start); |
| Russ Butler |
7514:a0c71f3f3d2f | 161 | |
| Russ Butler |
7514:a0c71f3f3d2f | 162 | // Allocate memory and assert size change |
| Russ Butler |
7514:a0c71f3f3d2f | 163 | data = realloc(NULL, ALLOCATION_SIZE_DEFAULT); |
| Russ Butler |
7514:a0c71f3f3d2f | 164 | TEST_ASSERT(data != NULL); |
| Russ Butler |
7514:a0c71f3f3d2f | 165 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 166 | increase = stats_current.current_size - stats_start.current_size; |
| Russ Butler |
7514:a0c71f3f3d2f | 167 | TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_DEFAULT); |
| Russ Butler |
7514:a0c71f3f3d2f | 168 | |
| Russ Butler |
7514:a0c71f3f3d2f | 169 | // Decrease size and assert size change |
| Russ Butler |
7514:a0c71f3f3d2f | 170 | data = realloc(data, ALLOCATION_SIZE_SMALL); |
| Russ Butler |
7514:a0c71f3f3d2f | 171 | TEST_ASSERT(data != NULL); |
| Russ Butler |
7514:a0c71f3f3d2f | 172 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 173 | increase = stats_current.current_size - stats_start.current_size; |
| Russ Butler |
7514:a0c71f3f3d2f | 174 | TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_SMALL); |
| Russ Butler |
7514:a0c71f3f3d2f | 175 | |
| Russ Butler |
7514:a0c71f3f3d2f | 176 | // Increase size and assert size change |
| Russ Butler |
7514:a0c71f3f3d2f | 177 | data = realloc(data, ALLOCATION_SIZE_LARGE); |
| Russ Butler |
7514:a0c71f3f3d2f | 178 | TEST_ASSERT(data != NULL); |
| Russ Butler |
7514:a0c71f3f3d2f | 179 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 180 | increase = stats_current.current_size - stats_start.current_size; |
| Russ Butler |
7514:a0c71f3f3d2f | 181 | TEST_ASSERT_EQUAL_UINT32(increase, ALLOCATION_SIZE_LARGE); |
| Russ Butler |
7514:a0c71f3f3d2f | 182 | |
| Russ Butler |
7514:a0c71f3f3d2f | 183 | // Free memory and assert back to starting size |
| Russ Butler |
7514:a0c71f3f3d2f | 184 | free(data); |
| Russ Butler |
7514:a0c71f3f3d2f | 185 | mbed_stats_heap_get(&stats_current); |
| Russ Butler |
7514:a0c71f3f3d2f | 186 | TEST_ASSERT_EQUAL_UINT32(stats_start.current_size, stats_current.current_size); |
| Russ Butler |
7514:a0c71f3f3d2f | 187 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 188 | |
| Russ Butler |
7514:a0c71f3f3d2f | 189 | Case cases[] = { |
| Russ Butler |
7514:a0c71f3f3d2f | 190 | Case("malloc and free size", test_case_malloc_free_size), |
| Russ Butler |
7514:a0c71f3f3d2f | 191 | Case("allocate size zero", test_case_allocate_zero), |
| Russ Butler |
7514:a0c71f3f3d2f | 192 | Case("allocation failure", test_case_allocate_fail), |
| Russ Butler |
7514:a0c71f3f3d2f | 193 | Case("realloc size", test_case_realloc_size), |
| Russ Butler |
7514:a0c71f3f3d2f | 194 | }; |
| Russ Butler |
7514:a0c71f3f3d2f | 195 | |
| Russ Butler |
7514:a0c71f3f3d2f | 196 | utest::v1::status_t greentea_test_setup(const size_t number_of_cases) |
| Russ Butler |
7514:a0c71f3f3d2f | 197 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 198 | GREENTEA_SETUP(20, "default_auto"); |
| Russ Butler |
7514:a0c71f3f3d2f | 199 | return greentea_test_setup_handler(number_of_cases); |
| Russ Butler |
7514:a0c71f3f3d2f | 200 | } |
| Russ Butler |
7514:a0c71f3f3d2f | 201 | |
| Russ Butler |
7514:a0c71f3f3d2f | 202 | Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler); |
| Russ Butler |
7514:a0c71f3f3d2f | 203 | |
| Russ Butler |
7514:a0c71f3f3d2f | 204 | int main() |
| Russ Butler |
7514:a0c71f3f3d2f | 205 | { |
| Russ Butler |
7514:a0c71f3f3d2f | 206 | Harness::run(specification); |
| Russ Butler |
7514:a0c71f3f3d2f | 207 | } |