pw_thread_threadx: Add basic thread snapshotting
Adds an optional library for capturing ThreadX thread state in
proto snapshots.
Change-Id: I47dbc5a57faf3d4411255ea83f04f17bf0a4dc46
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/51405
Commit-Queue: Rob Mohr <mohrr@google.com>
Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com>
Reviewed-by: Ewout van Bekkum <ewout@google.com>
diff --git a/pw_thread_threadx/util.cc b/pw_thread_threadx/util.cc
new file mode 100644
index 0000000..0d9c5e5
--- /dev/null
+++ b/pw_thread_threadx/util.cc
@@ -0,0 +1,44 @@
+// Copyright 2021 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+#include "pw_thread_threadx/util.h"
+
+#include "pw_function/function.h"
+#include "pw_status/status.h"
+#include "pw_status/try.h"
+#include "tx_api.h"
+#include "tx_thread.h"
+
+namespace pw::thread::threadx {
+
+namespace internal {
+
+// Iterates through all threads that haven't been deleted, calling the provided
+// call
+Status ForEachThread(const TX_THREAD& starting_thread, ThreadCallback& cb) {
+ const TX_THREAD* thread = &starting_thread;
+ do {
+ PW_TRY(cb(*thread));
+ thread = thread->tx_thread_created_next;
+ } while (thread != &starting_thread);
+
+ return OkStatus();
+}
+
+} // namespace internal
+
+Status ForEachThread(ThreadCallback& cb) {
+ return internal::ForEachThread(*_tx_thread_created_ptr, cb);
+}
+
+} // namespace pw::thread::threadx