pw_thread_freertos: apply pw_thread_embos style changes
Change-Id: Ic85ef57b089e4f83d73e994c613b3b01d2be4107
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/45423
Reviewed-by: Keir Mierle <keir@google.com>
Pigweed-Auto-Submit: Ewout van Bekkum <ewout@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
diff --git a/pw_thread_freertos/BUILD b/pw_thread_freertos/BUILD
index 5b0895d..c36ba6d 100644
--- a/pw_thread_freertos/BUILD
+++ b/pw_thread_freertos/BUILD
@@ -96,6 +96,7 @@
deps = [
":id",
"//pw_assert",
+ "//pw_string",
"//pw_sync:binary_semaphore",
"//pw_thread:thread_headers",
],
diff --git a/pw_thread_freertos/BUILD.gn b/pw_thread_freertos/BUILD.gn
index 7071804..742a1e2 100644
--- a/pw_thread_freertos/BUILD.gn
+++ b/pw_thread_freertos/BUILD.gn
@@ -104,6 +104,7 @@
public_deps = [
":config",
"$dir_pw_assert",
+ "$dir_pw_string",
"$dir_pw_third_party/freertos",
"$dir_pw_thread:id",
"$dir_pw_thread:thread.facade",
diff --git a/pw_thread_freertos/public/pw_thread_freertos/config.h b/pw_thread_freertos/public/pw_thread_freertos/config.h
index 90c8c7a..b0494d4 100644
--- a/pw_thread_freertos/public/pw_thread_freertos/config.h
+++ b/pw_thread_freertos/public/pw_thread_freertos/config.h
@@ -18,8 +18,16 @@
#include "task.h"
// Whether thread joining is enabled. By default this is disabled.
-// When enabled this adds a StaticEventGroup_t & EventGroupHandle_t to
-// every pw::thread::Thread's context.
+//
+// We suggest only enabling this when thread joining is required to minimize
+// the RAM and ROM cost of threads.
+//
+// Enabling this grows the RAM footprint of every pw::thread::Thread as it adds
+// a StaticEventGroup_t to every thread's pw::thread::freertos::Context. In
+// addition, there is a minute ROM cost to construct and destroy this added
+// object.
+//
+// PW_THREAD_JOINING_ENABLED gets set to this value.
#ifndef PW_THREAD_FREERTOS_CONFIG_JOINING_ENABLED
#define PW_THREAD_FREERTOS_CONFIG_JOINING_ENABLED 0
#endif // PW_THREAD_FREERTOS_CONFIG_JOINING_ENABLED
@@ -47,7 +55,7 @@
// The default stack size in words. By default this uses the minimal FreeRTOS
// priority level above the idle priority.
#ifndef PW_THREAD_FREERTOS_CONFIG_DEFAULT_PRIORITY
-#define PW_THREAD_FREERTOS_CONFIG_DEFAULT_PRIORITY tskIDLE_PRIORITY + 1
+#define PW_THREAD_FREERTOS_CONFIG_DEFAULT_PRIORITY (tskIDLE_PRIORITY + 1)
#endif // PW_THREAD_FREERTOS_CONFIG_DEFAULT_PRIORITY
namespace pw::thread::freertos::config {
diff --git a/pw_thread_freertos/public/pw_thread_freertos/context.h b/pw_thread_freertos/public/pw_thread_freertos/context.h
index 71bf1d5..a1c0bc4 100644
--- a/pw_thread_freertos/public/pw_thread_freertos/context.h
+++ b/pw_thread_freertos/public/pw_thread_freertos/context.h
@@ -56,8 +56,8 @@
using ThreadRoutine = void (*)(void* arg);
void set_thread_routine(ThreadRoutine entry, void* arg) {
- entry_ = entry;
- arg_ = arg;
+ user_thread_entry_function_ = entry;
+ user_thread_entry_arg_ = arg;
}
bool detached() const { return detached_; }
@@ -75,12 +75,12 @@
StaticEventGroup_t& join_event_group() { return event_group_; }
#endif // PW_THREAD_JOINING_ENABLED
- static void RunThread(void* void_context_ptr);
+ static void ThreadEntryPoint(void* void_context_ptr);
static void TerminateThread(Context& context);
TaskHandle_t task_handle_ = nullptr;
- ThreadRoutine entry_ = nullptr;
- void* arg_ = nullptr;
+ ThreadRoutine user_thread_entry_function_ = nullptr;
+ void* user_thread_entry_arg_ = nullptr;
#if PW_THREAD_JOINING_ENABLED
// Note that the FreeRTOS life cycle of this event group is managed together
// with the task life cycle, not this object's life cycle.
diff --git a/pw_thread_freertos/thread.cc b/pw_thread_freertos/thread.cc
index 5f63291..7854e19 100644
--- a/pw_thread_freertos/thread.cc
+++ b/pw_thread_freertos/thread.cc
@@ -31,9 +31,11 @@
#endif // PW_THREAD_JOINING_ENABLED
} // namespace
-void Context::RunThread(void* void_context_ptr) {
+void Context::ThreadEntryPoint(void* void_context_ptr) {
Context& context = *static_cast<Context*>(void_context_ptr);
- context.entry_(context.arg_);
+
+ // Invoke the user's thread function. This may never return.
+ context.user_thread_entry_function_(context.user_thread_entry_arg_);
// Use a task only critical section to guard against join() and detach().
vTaskSuspendAll();
@@ -44,8 +46,9 @@
context.set_task_handle(nullptr);
#if PW_THREAD_JOINING_ENABLED
- // Just in case someone abused our API, ensure their use of the event group
- // is properly handled by the kernel regardless.
+ // If the thread handle was detached before the thread finished execution,
+ // i.e. got here, then we are responsible for cleaning up the join event
+ // group.
vEventGroupDelete(&context.join_event_group());
#endif // PW_THREAD_JOINING_ENABLED
@@ -133,7 +136,7 @@
// invoke the task with its arg.
native_type_->set_thread_routine(entry, arg);
const TaskHandle_t task_handle =
- xTaskCreateStatic(Context::RunThread,
+ xTaskCreateStatic(Context::ThreadEntryPoint,
options.name(),
options.static_context()->stack().size(),
native_type_,
@@ -164,7 +167,7 @@
// invoke the task with its arg.
native_type_->set_thread_routine(entry, arg);
TaskHandle_t task_handle;
- const BaseType_t result = xTaskCreate(Context::RunThread,
+ const BaseType_t result = xTaskCreate(Context::ThreadEntryPoint,
options.name(),
options.stack_size_words(),
native_type_,
@@ -197,12 +200,12 @@
#endif // INCLUDE_vTaskSuspend == 1
if (thread_done) {
- // The task finished (hit end of Context::RunThread) before we invoked
- // detach, clean up the thread.
+ // The task finished (hit end of Context::ThreadEntryPoint) before we
+ // invoked detach, clean up the thread.
Context::TerminateThread(*native_type_);
} else {
// We're detaching before the task finished, defer cleanup to the task at
- // the end of Context::RunThread.
+ // the end of Context::ThreadEntryPoint.
}
// Update to no longer represent a thread of execution.