diff options
Diffstat (limited to 'pw_thread/public/pw_thread/thread_core.h')
-rw-r--r-- | pw_thread/public/pw_thread/thread_core.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pw_thread/public/pw_thread/thread_core.h b/pw_thread/public/pw_thread/thread_core.h new file mode 100644 index 000000000..23e4c6232 --- /dev/null +++ b/pw_thread/public/pw_thread/thread_core.h @@ -0,0 +1,48 @@ +// 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. +#pragma once + +namespace pw::thread { + +// An optional virtual interface which can be implemented by objects which are +// a thread as a helper to use pw::thread::Thread. +// +// This wrapper means that the user is not required to provide the indirection +// callback to call run based on the passed context. For example instead of: +// +// static auto invoke_foo_start = [](void *void_foo_ptr) { +// static_cast<Foo*>(void_foo_ptr)->Start(); +// }; +// Thread thread(options, invoke_foo_start, &foo).detach(); +// +// You can instead use the helper constructor in Thread: +// +// Thread thread(options, foo).detach(); +// +// WARNING: Because the thread may start after the pw::Thread creation, an +// object which implements the ThreadCore MUST meet or exceed the lifetime of +// its thread of execution! +class ThreadCore { + public: + virtual ~ThreadCore() = default; + + // The public API to start a ThreadCore, note that this may return. + void Start() { Run(); } + + private: + // This function may return. + virtual void Run() = 0; +}; + +} // namespace pw::thread |