/* * @licence app begin@ * SPDX license identifier: MPL-2.0 * * Copyright (C) 2011-2015, BMW AG * * This file is part of GENIVI Project DLT - Diagnostic Log and Trace. * * This Source Code Form is subject to the terms of the * Mozilla Public License (MPL), v. 2.0. * If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. * * For further information see http://www.genivi.org/. * @licence end@ */ /*! * \author Sven Hassler * * \copyright Copyright © 2011-2015 BMW AG. \n * License MPL-2.0: Mozilla Public License version 2.0 http://mozilla.org/MPL/2.0/. * * \file dlt-test-init-free.c */ #include #include #include #include #include "dlt_common.h" #include "dlt_user.h" void exec(const char* cmd, char *buffer, size_t length); void printMemoryUsage(); char* occupyMemory(uint size); void do_example_test(); void do_dlt_test(); int num_repetitions; int main(int argc, char **argv) { if (argc > 1) num_repetitions = strtol(argv[1], 0, 10); else num_repetitions = 1000; printf("Will do %d repetitions.\n", num_repetitions); //do_example_test(); do_dlt_test(); printf("Done.\n"); return 0; } // Should increase and then decrease memory amount. void do_example_test() { const int immediatelyFree = 0; int numBufs = 1024; int sizePerBuf = 1024 * 1024; // 1MB char** bufs = (char**) malloc(numBufs * sizeof(char*)); for (int i = 0; i < numBufs; i++) { bufs[i] = occupyMemory(sizePerBuf); printf("after alloc: "); printMemoryUsage(); if (immediatelyFree) { free(bufs[i]); printf("after free: "); printMemoryUsage(); } } printf("deleting memory:\n"); if (!immediatelyFree) for (int i = 0; i < numBufs; i++) //for (int i = numBufs - 1; i >= 0; i--) // other way round works, too { free(bufs[i]); printf("after free: "); printMemoryUsage(); } free(bufs); } // Should give stable amount of memory across all iterations. void do_dlt_test() { for (int i = 0; i < num_repetitions; i++) { dlt_init(); dlt_free(); printf("Iteration %d) - currently used memory amount: ", i); printMemoryUsage(); } } void exec(const char* cmd, char *buffer, size_t length) { FILE* pipe = NULL; strncpy(buffer, "ERROR", length); if ( (pipe = popen(cmd, "r")) == NULL ) return; while (fgets(buffer, length, pipe) != NULL); if(pipe != NULL) pclose(pipe); } void printMemoryUsage() { char result[128] = { 0 }; char command[128] = { 0 }; snprintf(command, sizeof(command), "pmap %d | grep total", getpid()); exec(command, result, sizeof(result)); printf("%s", result); } char* occupyMemory(uint size) { char* buf = (char*) malloc(size * sizeof(char)); for (int i = 0; i < 1; i++) { buf[i] = 1; } return buf; }