Skip to content

CMSIS layer never free()'s memory associated with a thread that has been detached and terminated #48

@RobMeades

Description

@RobMeades

We are using ThreadX through the CMSIS2 layer provided here with USE_DYNAMIC_MEMORY_ALLOCATION.

When we delete a task, we call osThreadDetach() and then osThreadTerminate(), expecting this to free the memory that was allocated when we called osThreadNew(); however this is never the case, and we soon run out of memory.

You can see this if you set break-points here:

osStatus_t osThreadTerminate(osThreadId_t thread_id)

...here:

_tx_thread_system_preempt_check();

...and here:

if (thread_ptr->tx_thread_detached_joinable == osThreadDetached)

The first two break points are reached when osThreadTerminate() is called, status is 0 at the second break-point but, the last break-point is never reached, presumably because _tx_thread_system_preempt_check() has done its stuff, task-switching has occurred, the code that follows the call to tx_thread_terminate() is never going to be run.

How is this meant to work?

FYI, we have tried calling tx_thread_preemption_change() and tx_thread_priority_change() with zero before terminating that thread, to set the current thread to top priority (0 in ThreadX terms), which this post suggests should effectively create a critical section, but that doesn't change the behaviour, _tx_thread_system_preempt_check() still chooses to switch to what is now a lower-priority (54 in ThreadX terms) thread.

This tested on a Nucleo STM32F575ZI board, in case it matters.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinginternal bug trackerIssue confirmed and logged into the internal bug tracking systemmwMiddleware-related issue or pull-request.rtosReal-Time Operating Systemspotted before customerSpotted internally before being pointed out by the user but not yet fixed or published

Type

No type

Projects

Status

In progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions