blob: eee57b766c2f8928d9642a9920663719b4d0af3d [file] [log] [blame]
Armando Montanezfec572b2021-06-28 12:13:57 -07001// Copyright 2021 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#include "pw_thread_threadx/util.h"
15
16#include "pw_function/function.h"
17#include "pw_status/status.h"
Armando Montanezfec572b2021-06-28 12:13:57 -070018#include "tx_api.h"
19#include "tx_thread.h"
20
21namespace pw::thread::threadx {
22
23namespace internal {
24
25// Iterates through all threads that haven't been deleted, calling the provided
Armando Montanez5d08f062021-07-19 10:17:03 -070026// callback.
Wyatt Heplerf79b9d02021-11-08 16:03:53 -080027Status ForEachThread(const TX_THREAD& starting_thread,
28 const ThreadCallback& cb) {
Armando Montanezfec572b2021-06-28 12:13:57 -070029 const TX_THREAD* thread = &starting_thread;
30 do {
Armando Montanez5d08f062021-07-19 10:17:03 -070031 if (!cb(*thread)) {
32 // Early-terminate iteration if requested by the callback.
33 return Status::Aborted();
34 }
Armando Montanezfec572b2021-06-28 12:13:57 -070035 thread = thread->tx_thread_created_next;
36 } while (thread != &starting_thread);
37
38 return OkStatus();
39}
40
41} // namespace internal
42
Wyatt Heplerf79b9d02021-11-08 16:03:53 -080043Status ForEachThread(const ThreadCallback& cb) {
Armando Montanezfec572b2021-06-28 12:13:57 -070044 return internal::ForEachThread(*_tx_thread_created_ptr, cb);
45}
46
47} // namespace pw::thread::threadx