diff options
Diffstat (limited to 'src/libPThread')
| -rw-r--r-- | src/libPThread/PThreadKit/Thread.h | 12 | ||||
| -rw-r--r-- | src/libPThread/PThreadKit/pthread.h | 11 | ||||
| -rw-r--r-- | src/libPThread/src/Thread.cpp | 53 |
3 files changed, 54 insertions, 22 deletions
diff --git a/src/libPThread/PThreadKit/Thread.h b/src/libPThread/PThreadKit/Thread.h index 053885e7..7e528ab2 100644 --- a/src/libPThread/PThreadKit/Thread.h +++ b/src/libPThread/PThreadKit/Thread.h @@ -8,7 +8,15 @@ #include <libPOSIXWrapper/POSIXKit/unistd.h> -#define PTHREAD_UNSAFE /* hint */ -#define PTHREAD_SAFE /* hint */ +/// @internal Internal type, please do not rely on it for multi-platform builds. +typedef ThreadRef pthread_ref_t; + +PTHREAD_SAFE IMPORT_C SInt32 pthread_create(_Output pthread_ref_t* thread, VoidPtr attr, + VoidPtr (*start_routine)(VoidPtr), VoidPtr arg); +PTHREAD_SAFE IMPORT_C SInt32 pthread_join(pthread_ref_t thread, VoidPtr* retval); +PTHREAD_SAFE IMPORT_C SInt32 pthread_exit(SInt32 retval); +PTHREAD_SAFE IMPORT_C SInt32 pthread_detach(pthread_ref_t thread); +PTHREAD_SAFE IMPORT_C pthread_ref_t pthread_self(Void); +PTHREAD_SAFE IMPORT_C SInt32 pthread_yield(void); #endif // LIBPOSIX_POSIXKIT_THREAD_H diff --git a/src/libPThread/PThreadKit/pthread.h b/src/libPThread/PThreadKit/pthread.h new file mode 100644 index 00000000..2448c458 --- /dev/null +++ b/src/libPThread/PThreadKit/pthread.h @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2026, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (see LICENSE file) +// Official repository: https://github.com/ne-foss-org/nekernel + +#ifndef LIBPOSIX_POSIXKIT_PTHREAD_H +#define LIBPOSIX_POSIXKIT_PTHREAD_H + +#include <libPThread/ThreadKit/Thread.h> + +#endif diff --git a/src/libPThread/src/Thread.cpp b/src/libPThread/src/Thread.cpp index 34a610cd..5324d979 100644 --- a/src/libPThread/src/Thread.cpp +++ b/src/libPThread/src/Thread.cpp @@ -5,29 +5,42 @@ #include <libPThread/PThreadKit/Thread.h> -namespace POSIXKit::Detail { +PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread) { + return ThrDetachThread(thread); +} - /// @brief Max path structure. - constexpr auto kMaxPathLen = 255; - static constexpr auto kCanaryValue = 0xf0f0488f; +PTHREAD_SAFE SInt32 pthread_yield(void) { + return ThrYieldThread(pthread_self()); +} - /// @brief Thread Information Structure. - struct ThreadFrameParams final { - SInt64 fCanary; - VoidPtr fStackPtr; - VoidPtr fCodePtr; - SizeT fCodeSz; - SizeT fStackSz; - SInt64 fThrdID; - SInt64 fUsrID, fGrpID; - SInt64* fFD{}; - SizeT fFDCnt; - Char fCWD[kMaxPathLen]; - Char fRoot[kMaxPathLen]; - ThreadRef fRef; - }; +PTHREAD_SAFE ThreadRef pthread_self(Void) { + return ThrCurrentThread(); +} -} // namespace POSIX::Detail +PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval) { + return ThrExitCurrentThread(retval); +} +PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval) { + SInt32* ret = (SInt32*) retval; + if (!ret) return -1; + *ret = ThrJoinThread(thread); + return 0; +} + +PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, + VoidPtr (*start_routine)(VoidPtr), VoidPtr arg) { + LIBSYS_UNUSED(attr); + + if (!attr || !thread || !arg || !start_routine) return -1; + + /// @note passing zero means you'd have to read the argv until you hit a nullptr. + ThreadRef thrd = ThrCreateThread("pthread_thread", (ThrProcKind) start_routine, 0, arg, 0); + + if (!thrd) return -1; + + *thread = thrd; + return 0; +} |
