Skip to content

Commit c16cc35

Browse files
committed
General block device test: Fix thread stack allocation
The test case for multithreaded erase/program/read allocates a few Thread objects from the heap and starts them. It has a few problems: * To check that there will be enough heap to start a new thread, the test case tries to allocate a dummy buffer of the thread's heap size and then frees it, before starting the thread. Then the thread will allocate its own stack. Such check is not reliable, because threads that are already running also perform additional allocation (when running `test_thread_job()`) and may take away the memory we just checked. * When deleting all threads in a loop, the loop boundary misses the last thread if the last thread object was allocated but not started (i.e. due to failed thread stack allocation check). To fix the issues * Start a thread without any allocation test (which is unreliable). Following the preceding commit "rtos: Thread: Make stack allocation failure runtime catchable", `Thread::start()` now returns `osErrorNoMemory` if stack allocation fails which we can handle. * Store pointers to all threads in a zero-initialized array, and free all elements at the end of the test.
1 parent 2640f9d commit c16cc35

File tree

1 file changed

+8
-14
lines changed
  • storage/blockdevice/tests/TESTS/blockdevice/general_block_device

1 file changed

+8
-14
lines changed

storage/blockdevice/tests/TESTS/blockdevice/general_block_device/main.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -421,22 +421,19 @@ void test_multi_threads()
421421

422422
osStatus threadStatus;
423423
int i_ind, j_ind;
424-
char *dummy;
425424

426-
rtos::Thread **bd_thread = new (std::nothrow) rtos::Thread*[TEST_NUM_OF_THREADS];
427-
TEST_SKIP_UNLESS_MESSAGE((*bd_thread) != NULL, "not enough heap to run test.");
428-
memset(bd_thread, 0, TEST_NUM_OF_THREADS * sizeof(rtos::Thread *));
425+
rtos::Thread *bd_thread[TEST_NUM_OF_THREADS] {};
426+
unsigned char *stack[TEST_NUM_OF_THREADS] {};
429427

430428
for (i_ind = 0; i_ind < TEST_NUM_OF_THREADS; i_ind++) {
431429

432-
bd_thread[i_ind] = new (std::nothrow) rtos::Thread((osPriority_t)((int)osPriorityNormal), TEST_THREAD_STACK_SIZE);
433-
dummy = new (std::nothrow) char[TEST_THREAD_STACK_SIZE];
430+
stack[i_ind] = new (std::nothrow) unsigned char[TEST_THREAD_STACK_SIZE];
431+
bd_thread[i_ind] = new (std::nothrow) rtos::Thread((osPriority_t)((int)osPriorityNormal), TEST_THREAD_STACK_SIZE, stack[i_ind]);
434432

435-
if (!bd_thread[i_ind] || !dummy) {
433+
if (!bd_thread[i_ind] || !stack[i_ind]) {
436434
utest_printf("Not enough heap to run Thread %d !\n", i_ind + 1);
437435
break;
438436
}
439-
delete[] dummy;
440437

441438
threadStatus = bd_thread[i_ind]->start(callback(test_thread_job));
442439
if (threadStatus != 0) {
@@ -449,12 +446,9 @@ void test_multi_threads()
449446
bd_thread[j_ind]->join();
450447
}
451448

452-
if (bd_thread) {
453-
for (j_ind = 0; j_ind < i_ind; j_ind++) {
454-
delete bd_thread[j_ind];
455-
}
456-
457-
delete[] bd_thread;
449+
for (j_ind = 0; j_ind < TEST_NUM_OF_THREADS; j_ind++) {
450+
delete bd_thread[j_ind];
451+
delete[] stack[j_ind];
458452
}
459453
}
460454
#endif

0 commit comments

Comments
 (0)