Jim Carver
/
mbed-cloud-workshop-connect
Fork for workshops
simple-mbed-cloud-client/memory_tests.cpp@0:6b753f761943, 2018-10-12 (annotated)
- Committer:
- JimCarver
- Date:
- Fri Oct 12 21:22:49 2018 +0000
- Revision:
- 0:6b753f761943
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JimCarver | 0:6b753f761943 | 1 | // ---------------------------------------------------------------------------- |
JimCarver | 0:6b753f761943 | 2 | // Copyright 2016-2018 ARM Ltd. |
JimCarver | 0:6b753f761943 | 3 | // |
JimCarver | 0:6b753f761943 | 4 | // SPDX-License-Identifier: Apache-2.0 |
JimCarver | 0:6b753f761943 | 5 | // |
JimCarver | 0:6b753f761943 | 6 | // Licensed under the Apache License, Version 2.0 (the "License"); |
JimCarver | 0:6b753f761943 | 7 | // you may not use this file except in compliance with the License. |
JimCarver | 0:6b753f761943 | 8 | // You may obtain a copy of the License at |
JimCarver | 0:6b753f761943 | 9 | // |
JimCarver | 0:6b753f761943 | 10 | // http://www.apache.org/licenses/LICENSE-2.0 |
JimCarver | 0:6b753f761943 | 11 | // |
JimCarver | 0:6b753f761943 | 12 | // Unless required by applicable law or agreed to in writing, software |
JimCarver | 0:6b753f761943 | 13 | // distributed under the License is distributed on an "AS IS" BASIS, |
JimCarver | 0:6b753f761943 | 14 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
JimCarver | 0:6b753f761943 | 15 | // See the License for the specific language governing permissions and |
JimCarver | 0:6b753f761943 | 16 | // limitations under the License. |
JimCarver | 0:6b753f761943 | 17 | // ---------------------------------------------------------------------------- |
JimCarver | 0:6b753f761943 | 18 | |
JimCarver | 0:6b753f761943 | 19 | #ifdef TARGET_LIKE_MBED |
JimCarver | 0:6b753f761943 | 20 | |
JimCarver | 0:6b753f761943 | 21 | #ifdef MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 22 | // used by print_heap_stats only |
JimCarver | 0:6b753f761943 | 23 | #include "mbed_stats.h" |
JimCarver | 0:6b753f761943 | 24 | #define __STDC_FORMAT_MACROS |
JimCarver | 0:6b753f761943 | 25 | #include <inttypes.h> |
JimCarver | 0:6b753f761943 | 26 | #include "mbed-client/m2mbase.h" |
JimCarver | 0:6b753f761943 | 27 | #endif |
JimCarver | 0:6b753f761943 | 28 | |
JimCarver | 0:6b753f761943 | 29 | // fixup the compilation on AMRCC for PRIu32 |
JimCarver | 0:6b753f761943 | 30 | #define __STDC_FORMAT_MACROS |
JimCarver | 0:6b753f761943 | 31 | #include <inttypes.h> |
JimCarver | 0:6b753f761943 | 32 | |
JimCarver | 0:6b753f761943 | 33 | #include "memory_tests.h" |
JimCarver | 0:6b753f761943 | 34 | |
JimCarver | 0:6b753f761943 | 35 | #include "mbed-client/m2mblockmessage.h" |
JimCarver | 0:6b753f761943 | 36 | #include "mbed-client/m2mdevice.h" |
JimCarver | 0:6b753f761943 | 37 | #include "mbed-client/m2mfirmware.h" |
JimCarver | 0:6b753f761943 | 38 | #include "mbed-client/m2minterfacefactory.h" |
JimCarver | 0:6b753f761943 | 39 | #include "mbed-client/m2mobject.h" |
JimCarver | 0:6b753f761943 | 40 | #include "mbed-client/m2mserver.h" |
JimCarver | 0:6b753f761943 | 41 | #include "mbed-client/m2msecurity.h" |
JimCarver | 0:6b753f761943 | 42 | #include "source/include/m2mreporthandler.h" |
JimCarver | 0:6b753f761943 | 43 | |
JimCarver | 0:6b753f761943 | 44 | #include "mbed.h" |
JimCarver | 0:6b753f761943 | 45 | #include "mbed_stats.h" |
JimCarver | 0:6b753f761943 | 46 | |
JimCarver | 0:6b753f761943 | 47 | #include <assert.h> |
JimCarver | 0:6b753f761943 | 48 | |
JimCarver | 0:6b753f761943 | 49 | void heap_stats() |
JimCarver | 0:6b753f761943 | 50 | { |
JimCarver | 0:6b753f761943 | 51 | #ifdef MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 52 | mbed_stats_heap_t stats; |
JimCarver | 0:6b753f761943 | 53 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 54 | printf("**** current_size: %" PRIu32 "\n", stats.current_size); |
JimCarver | 0:6b753f761943 | 55 | printf("**** max_size : %" PRIu32 "\n", stats.max_size); |
JimCarver | 0:6b753f761943 | 56 | #endif // MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 57 | } |
JimCarver | 0:6b753f761943 | 58 | |
JimCarver | 0:6b753f761943 | 59 | void m2mobject_test_set(M2MObjectList& object_list) |
JimCarver | 0:6b753f761943 | 60 | { |
JimCarver | 0:6b753f761943 | 61 | #ifdef MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 62 | printf("*************************************\n"); |
JimCarver | 0:6b753f761943 | 63 | |
JimCarver | 0:6b753f761943 | 64 | mbed_stats_heap_t stats; |
JimCarver | 0:6b753f761943 | 65 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 66 | |
JimCarver | 0:6b753f761943 | 67 | uint32_t initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 68 | |
JimCarver | 0:6b753f761943 | 69 | const int object_count = 1; |
JimCarver | 0:6b753f761943 | 70 | const int object_id_range_start = 90; |
JimCarver | 0:6b753f761943 | 71 | const int object_id_range_end = object_id_range_start + object_count; |
JimCarver | 0:6b753f761943 | 72 | |
JimCarver | 0:6b753f761943 | 73 | const int object_instance_count = 5; |
JimCarver | 0:6b753f761943 | 74 | const int resource_count = 5; |
JimCarver | 0:6b753f761943 | 75 | |
JimCarver | 0:6b753f761943 | 76 | int total_object_count = 0; |
JimCarver | 0:6b753f761943 | 77 | int total_object_instance_count = 0; |
JimCarver | 0:6b753f761943 | 78 | int total_resource_count = 0; |
JimCarver | 0:6b753f761943 | 79 | |
JimCarver | 0:6b753f761943 | 80 | for (int object_id = object_id_range_start; object_id < object_id_range_end; object_id++) { |
JimCarver | 0:6b753f761943 | 81 | |
JimCarver | 0:6b753f761943 | 82 | char buff[64]; |
JimCarver | 0:6b753f761943 | 83 | sprintf(buff, "%d", object_id); |
JimCarver | 0:6b753f761943 | 84 | M2MObject *obj = M2MInterfaceFactory::create_object(buff); |
JimCarver | 0:6b753f761943 | 85 | |
JimCarver | 0:6b753f761943 | 86 | for (int object_instance_id = 0; object_instance_id < object_instance_count; object_instance_id++) { |
JimCarver | 0:6b753f761943 | 87 | |
JimCarver | 0:6b753f761943 | 88 | M2MObjectInstance* obj_inst = obj->create_object_instance(object_instance_id); |
JimCarver | 0:6b753f761943 | 89 | |
JimCarver | 0:6b753f761943 | 90 | assert(obj_inst != NULL); |
JimCarver | 0:6b753f761943 | 91 | total_object_instance_count++; |
JimCarver | 0:6b753f761943 | 92 | for (int resource_id = 0; resource_id < resource_count; resource_id++) { |
JimCarver | 0:6b753f761943 | 93 | String res_name; |
JimCarver | 0:6b753f761943 | 94 | String res_type; |
JimCarver | 0:6b753f761943 | 95 | |
JimCarver | 0:6b753f761943 | 96 | res_name.append_int(resource_id); |
JimCarver | 0:6b753f761943 | 97 | res_type.append_int(resource_id); |
JimCarver | 0:6b753f761943 | 98 | |
JimCarver | 0:6b753f761943 | 99 | M2MResource* resource = obj_inst->create_dynamic_resource(res_name, res_type, |
JimCarver | 0:6b753f761943 | 100 | M2MResourceInstance::INTEGER, true); |
JimCarver | 0:6b753f761943 | 101 | |
JimCarver | 0:6b753f761943 | 102 | assert(resource != NULL); |
JimCarver | 0:6b753f761943 | 103 | |
JimCarver | 0:6b753f761943 | 104 | resource->set_operation(M2MBase::GET_ALLOWED); |
JimCarver | 0:6b753f761943 | 105 | resource->set_value(7); |
JimCarver | 0:6b753f761943 | 106 | |
JimCarver | 0:6b753f761943 | 107 | total_resource_count++; |
JimCarver | 0:6b753f761943 | 108 | } |
JimCarver | 0:6b753f761943 | 109 | } |
JimCarver | 0:6b753f761943 | 110 | |
JimCarver | 0:6b753f761943 | 111 | object_list.push_back(obj); |
JimCarver | 0:6b753f761943 | 112 | total_object_count++; |
JimCarver | 0:6b753f761943 | 113 | } |
JimCarver | 0:6b753f761943 | 114 | |
JimCarver | 0:6b753f761943 | 115 | printf("objects : %d\n", total_object_count); |
JimCarver | 0:6b753f761943 | 116 | printf("obj instances : %d\n", total_object_instance_count); |
JimCarver | 0:6b753f761943 | 117 | printf("resources : %d\n", total_resource_count); |
JimCarver | 0:6b753f761943 | 118 | |
JimCarver | 0:6b753f761943 | 119 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 120 | printf("heap used : %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 121 | |
JimCarver | 0:6b753f761943 | 122 | printf("*************************************\n"); |
JimCarver | 0:6b753f761943 | 123 | #endif // MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 124 | } |
JimCarver | 0:6b753f761943 | 125 | |
JimCarver | 0:6b753f761943 | 126 | // Note: the mbed-os needs to be compiled with MBED_HEAP_STATS_ENABLED to get |
JimCarver | 0:6b753f761943 | 127 | // functional heap stats, or the mbed_stats_heap_get() will return just zeroes. |
JimCarver | 0:6b753f761943 | 128 | void m2mobject_stats() |
JimCarver | 0:6b753f761943 | 129 | { |
JimCarver | 0:6b753f761943 | 130 | #ifdef MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 131 | printf("\n*** M2M object sizes in bytes ***\n"); |
JimCarver | 0:6b753f761943 | 132 | printf("M2MBase: %" PRIu32 "\n", sizeof(M2MBase)); |
JimCarver | 0:6b753f761943 | 133 | printf("M2MObject: %" PRIu32 "\n", sizeof(M2MObject)); |
JimCarver | 0:6b753f761943 | 134 | printf("M2MObjectInstance: %" PRIu32 "\n", sizeof(M2MObjectInstance)); |
JimCarver | 0:6b753f761943 | 135 | printf("M2MResource: %" PRIu32 "\n", sizeof(M2MResource)); |
JimCarver | 0:6b753f761943 | 136 | printf("M2MResourceInstance: %" PRIu32 "\n", sizeof(M2MResourceInstance)); |
JimCarver | 0:6b753f761943 | 137 | printf("M2MDevice: %" PRIu32 "\n", sizeof(M2MDevice)); |
JimCarver | 0:6b753f761943 | 138 | printf("M2MFirmware: %" PRIu32 "\n", sizeof(M2MFirmware)); |
JimCarver | 0:6b753f761943 | 139 | printf("M2MServer: %" PRIu32 "\n", sizeof(M2MServer)); |
JimCarver | 0:6b753f761943 | 140 | printf("M2MSecurity: %" PRIu32 "\n", sizeof(M2MSecurity)); |
JimCarver | 0:6b753f761943 | 141 | printf("M2MBlockMessage: %" PRIu32 "\n", sizeof(M2MBlockMessage)); |
JimCarver | 0:6b753f761943 | 142 | printf("M2MReportHandler: %" PRIu32 "\n", sizeof(M2MReportHandler)); |
JimCarver | 0:6b753f761943 | 143 | printf("*************************************\n\n"); |
JimCarver | 0:6b753f761943 | 144 | |
JimCarver | 0:6b753f761943 | 145 | mbed_stats_heap_t stats; |
JimCarver | 0:6b753f761943 | 146 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 147 | |
JimCarver | 0:6b753f761943 | 148 | printf("*** M2M heap stats in bytes***\n"); |
JimCarver | 0:6b753f761943 | 149 | uint32_t initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 150 | |
JimCarver | 0:6b753f761943 | 151 | // M2MDevice |
JimCarver | 0:6b753f761943 | 152 | M2MDevice *device_object = M2MInterfaceFactory::create_device(); |
JimCarver | 0:6b753f761943 | 153 | assert(device_object); |
JimCarver | 0:6b753f761943 | 154 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 155 | printf("M2MDevice heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 156 | M2MDevice::delete_instance(); |
JimCarver | 0:6b753f761943 | 157 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 158 | if (initial != stats.current_size) { |
JimCarver | 0:6b753f761943 | 159 | printf("M2MDevice leaked: %" PRIu32 "bytes\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 160 | } |
JimCarver | 0:6b753f761943 | 161 | |
JimCarver | 0:6b753f761943 | 162 | // M2MServer |
JimCarver | 0:6b753f761943 | 163 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 164 | M2MServer *server = M2MInterfaceFactory::create_server(); |
JimCarver | 0:6b753f761943 | 165 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 166 | printf("M2MServer heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 167 | delete server; |
JimCarver | 0:6b753f761943 | 168 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 169 | if (initial != stats.current_size) { |
JimCarver | 0:6b753f761943 | 170 | printf("M2MServer leaked: %" PRIu32 "bytes\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 171 | } |
JimCarver | 0:6b753f761943 | 172 | |
JimCarver | 0:6b753f761943 | 173 | // M2MSecurity |
JimCarver | 0:6b753f761943 | 174 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 175 | M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); |
JimCarver | 0:6b753f761943 | 176 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 177 | printf("M2MSecurity heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 178 | M2MSecurity::delete_instance(); |
JimCarver | 0:6b753f761943 | 179 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 180 | if (initial != stats.current_size) { |
JimCarver | 0:6b753f761943 | 181 | printf("M2MSecurity leaked: %" PRIu32 "bytes\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 182 | } |
JimCarver | 0:6b753f761943 | 183 | |
JimCarver | 0:6b753f761943 | 184 | // M2MFirmware |
JimCarver | 0:6b753f761943 | 185 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 186 | M2MFirmware *firmware = M2MInterfaceFactory::create_firmware(); |
JimCarver | 0:6b753f761943 | 187 | assert(firmware); |
JimCarver | 0:6b753f761943 | 188 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 189 | printf("M2MFirmware heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 190 | M2MFirmware::delete_instance(); |
JimCarver | 0:6b753f761943 | 191 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 192 | if (initial != stats.current_size) { |
JimCarver | 0:6b753f761943 | 193 | printf("M2MFirmware leaked: %" PRIu32 "bytes\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 194 | } |
JimCarver | 0:6b753f761943 | 195 | |
JimCarver | 0:6b753f761943 | 196 | // Basic object creation |
JimCarver | 0:6b753f761943 | 197 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 198 | uint32_t before_object = initial; |
JimCarver | 0:6b753f761943 | 199 | M2MObject *obj = M2MInterfaceFactory::create_object("1"); |
JimCarver | 0:6b753f761943 | 200 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 201 | printf("M2MObject heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 202 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 203 | |
JimCarver | 0:6b753f761943 | 204 | M2MObjectInstance* obj_inst = obj->create_object_instance(); |
JimCarver | 0:6b753f761943 | 205 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 206 | printf("M2MObjectInstance heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 207 | |
JimCarver | 0:6b753f761943 | 208 | initial = stats.current_size; |
JimCarver | 0:6b753f761943 | 209 | M2MResource* res = obj_inst->create_dynamic_resource("1", "1", M2MResourceInstance::STRING, false); |
JimCarver | 0:6b753f761943 | 210 | assert(res); |
JimCarver | 0:6b753f761943 | 211 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 212 | printf("M2MResource heap size: %" PRIu32 "\n", stats.current_size - initial); |
JimCarver | 0:6b753f761943 | 213 | |
JimCarver | 0:6b753f761943 | 214 | delete obj; |
JimCarver | 0:6b753f761943 | 215 | mbed_stats_heap_get(&stats); |
JimCarver | 0:6b753f761943 | 216 | if (before_object != stats.current_size) { |
JimCarver | 0:6b753f761943 | 217 | printf("Resource leaked: %" PRIu32 "bytes\n", stats.current_size - before_object); |
JimCarver | 0:6b753f761943 | 218 | } |
JimCarver | 0:6b753f761943 | 219 | printf("*************************************\n\n"); |
JimCarver | 0:6b753f761943 | 220 | #endif // MBED_HEAP_STATS_ENABLED |
JimCarver | 0:6b753f761943 | 221 | } |
JimCarver | 0:6b753f761943 | 222 | #endif // TARGET_LIKE_MBED |