8#include "pedigree/kernel/Log.h"
9#include "pedigree/kernel/panic.h"
10#include "pedigree/kernel/process/AdmittedThread.h"
11#include "pedigree/kernel/process/OperationBarrier.h"
12#include "pedigree/kernel/process/Scheduler.h"
13#include "pedigree/kernel/process/Thread.h"
14#include "pedigree/kernel/utilities/String.h"
15#include "pedigree/kernel/utilities/utility.h"
17#if (HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS) || PEDIGREE_CONCURRENCY_SMOKE_TESTS
19AdmittedThread::BeforeStartHook g_BeforeStartHook =
nullptr;
20void* g_BeforeStartHookContext =
nullptr;
29 admission(pedigree_std::move(admission)) {}
48 Context* context =
new Context(entry, parameter, cancel, pedigree_std::move(admission));
55 new Thread(kernelProcess, trampoline, context,
nullptr,
false,
true,
true, cancelBeforeStart);
62 thread->setName(
String(name));
65#if (HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS) || PEDIGREE_CONCURRENCY_SMOKE_TESTS
66 if (g_BeforeStartHook) {
67 g_BeforeStartHook(thread, g_BeforeStartHookContext);
71 panic(
"AdmittedThread could not publish its detached worker.");
77#if (HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS) || PEDIGREE_CONCURRENCY_SMOKE_TESTS
78void AdmittedThread::setBeforeStartHookForTest(BeforeStartHook hook,
void* context) {
79 g_BeforeStartHook = hook;
80 g_BeforeStartHookContext = context;
84void AdmittedThread::cancelBeforeStart(
void* parameter) {
85 Context* context =
reinterpret_cast<Context*
>(parameter);
86 if (context->cancel) {
87 context->cancel(context->parameter);
92int AdmittedThread::trampoline(
void* parameter) {
93 Context* context =
reinterpret_cast<Context*
>(parameter);
94 const Entry entry = context->entry;
95 void* entryParameter = context->parameter;
97 const int result = entry(entryParameter);
static MUST_USE_RESULT bool launchDetached(Entry entry, void *parameter, Cancel cancel, OperationBarrier &barrier, const char *name=nullptr)
MUST_USE_RESULT bool tryAcquire(Lease &lease)
static Scheduler & instance()
void EXPORTED_PUBLIC panic(const char *msg) NORETURN