Lee Kai Xuan / mbed-os

Fork of mbed-os by erkin yucel

Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elessair 0:f269e3021894 1 #include "mbed.h"
elessair 0:f269e3021894 2 #include "test_env.h"
elessair 0:f269e3021894 3 #include "rtos.h"
elessair 0:f269e3021894 4
elessair 0:f269e3021894 5 #if defined(MBED_RTOS_SINGLE_THREAD)
elessair 0:f269e3021894 6 #error [NOT_SUPPORTED] test not supported
elessair 0:f269e3021894 7 #endif
elessair 0:f269e3021894 8
elessair 0:f269e3021894 9 #define NUM_THREADS 5
elessair 0:f269e3021894 10 #define THREAD_STACK_SIZE 256
elessair 0:f269e3021894 11
elessair 0:f269e3021894 12 DigitalOut led1(LED1);
elessair 0:f269e3021894 13 volatile bool should_exit = false;
elessair 0:f269e3021894 14 volatile bool allocation_failure = false;
elessair 0:f269e3021894 15
elessair 0:f269e3021894 16 void task_using_malloc(void)
elessair 0:f269e3021894 17 {
elessair 0:f269e3021894 18 void* data;
elessair 0:f269e3021894 19 while (1) {
elessair 0:f269e3021894 20 // Repeatedly allocate and free memory
elessair 0:f269e3021894 21 data = malloc(100);
elessair 0:f269e3021894 22 if (data != NULL) {
elessair 0:f269e3021894 23 memset(data, 0, 100);
elessair 0:f269e3021894 24 } else {
elessair 0:f269e3021894 25 allocation_failure = true;
elessair 0:f269e3021894 26 }
elessair 0:f269e3021894 27 free(data);
elessair 0:f269e3021894 28
elessair 0:f269e3021894 29 if (should_exit) {
elessair 0:f269e3021894 30 return;
elessair 0:f269e3021894 31 }
elessair 0:f269e3021894 32 }
elessair 0:f269e3021894 33 }
elessair 0:f269e3021894 34
elessair 0:f269e3021894 35 int main()
elessair 0:f269e3021894 36 {
elessair 0:f269e3021894 37 Thread *thread_list[NUM_THREADS];
elessair 0:f269e3021894 38 int test_time = 15;
elessair 0:f269e3021894 39 GREENTEA_SETUP(20, "default_auto");
elessair 0:f269e3021894 40
elessair 0:f269e3021894 41 // Allocate threads for the test
elessair 0:f269e3021894 42 for (int i = 0; i < NUM_THREADS; i++) {
elessair 0:f269e3021894 43 thread_list[i] = new Thread(osPriorityNormal, THREAD_STACK_SIZE);
elessair 0:f269e3021894 44 if (NULL == thread_list[i]) {
elessair 0:f269e3021894 45 allocation_failure = true;
elessair 0:f269e3021894 46 }
elessair 0:f269e3021894 47 thread_list[i]->start(task_using_malloc);
elessair 0:f269e3021894 48 }
elessair 0:f269e3021894 49
elessair 0:f269e3021894 50 // Give the test time to run
elessair 0:f269e3021894 51 while (test_time) {
elessair 0:f269e3021894 52 led1 = !led1;
elessair 0:f269e3021894 53 Thread::wait(1000);
elessair 0:f269e3021894 54 test_time--;
elessair 0:f269e3021894 55 }
elessair 0:f269e3021894 56
elessair 0:f269e3021894 57 // Join and delete all threads
elessair 0:f269e3021894 58 should_exit = 1;
elessair 0:f269e3021894 59 for (int i = 0; i < NUM_THREADS; i++) {
elessair 0:f269e3021894 60 if (NULL == thread_list[i]) {
elessair 0:f269e3021894 61 continue;
elessair 0:f269e3021894 62 }
elessair 0:f269e3021894 63 thread_list[i]->join();
elessair 0:f269e3021894 64 delete thread_list[i];
elessair 0:f269e3021894 65 }
elessair 0:f269e3021894 66
elessair 0:f269e3021894 67 GREENTEA_TESTSUITE_RESULT(!allocation_failure);
elessair 0:f269e3021894 68 }