summaryrefslogtreecommitdiffhomepage
path: root/src/libPThread
diff options
context:
space:
mode:
Diffstat (limited to 'src/libPThread')
-rw-r--r--src/libPThread/.keep0
-rw-r--r--src/libPThread/PThreadKit/.keep0
-rw-r--r--src/libPThread/PThreadKit/Thread.h22
-rw-r--r--src/libPThread/libPThread.json22
-rw-r--r--src/libPThread/src/.keep0
-rw-r--r--src/libPThread/src/Thread.cpp42
6 files changed, 86 insertions, 0 deletions
diff --git a/src/libPThread/.keep b/src/libPThread/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/.keep
diff --git a/src/libPThread/PThreadKit/.keep b/src/libPThread/PThreadKit/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/PThreadKit/.keep
diff --git a/src/libPThread/PThreadKit/Thread.h b/src/libPThread/PThreadKit/Thread.h
new file mode 100644
index 00000000..5282a623
--- /dev/null
+++ b/src/libPThread/PThreadKit/Thread.h
@@ -0,0 +1,22 @@
+// 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_THREAD_H
+#define LIBPOSIX_POSIXKIT_THREAD_H
+
+#include <libPOSIXWrapper/POSIXKit/unistd.h>
+
+/// @brief Please use these macros to specify whether your function is thread safe or not.
+#define PTHREAD_UNSAFE __THREAD_UNSAFE
+#define PTHREAD_SAFE __THREAD_SAFE
+
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg);
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval);
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval);
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread);
+PTHREAD_SAFE ThreadRef pthread_self(Void);
+PTHREAD_SAFE SInt32 pthread_yield(void);
+
+#endif // LIBPOSIX_POSIXKIT_THREAD_H
diff --git a/src/libPThread/libPThread.json b/src/libPThread/libPThread.json
new file mode 100644
index 00000000..a5cfba73
--- /dev/null
+++ b/src/libPThread/libPThread.json
@@ -0,0 +1,22 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-gcc",
+ "compiler_std": "c++20",
+ "headers_path": ["../", "./"],
+ "sources_path": ["src/*.cpp"],
+ "output_name": "libPThread.dll",
+ "compiler_flags": [
+ "-ffreestanding",
+ "-shared",
+ "-std=c++20",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17"
+ ],
+ "cpp_macros": [
+ "__NEOSKRNL__",
+ "kPosixVersionHighest=0x0100",
+ "kPosixVersionLowest=0x0100",
+ "kPosixVersion=0x0100"
+ ],
+ "description": "The NeKernel PThread System. Refer to: https://man7.org/linux/man-pages/man7/pthreads.7.html"
+}
diff --git a/src/libPThread/src/.keep b/src/libPThread/src/.keep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/libPThread/src/.keep
diff --git a/src/libPThread/src/Thread.cpp b/src/libPThread/src/Thread.cpp
new file mode 100644
index 00000000..5a351be8
--- /dev/null
+++ b/src/libPThread/src/Thread.cpp
@@ -0,0 +1,42 @@
+// 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
+
+#include <libPThread/PThreadKit/Thread.h>
+
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread) {
+ return ThrDetachThread(thread);
+}
+
+PTHREAD_SAFE SInt32 pthread_yield(void) {
+ return ThrYieldThread(pthread_self());
+}
+
+PTHREAD_SAFE ThreadRef pthread_self(Void) {
+ return ThrCurrentThread();
+}
+
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval) {
+ return ThrExitCurrentThread(retval);
+}
+
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval) {
+ SInt32* ret = (SInt32*)retval;
+ *ret = ThrJoinThread(thread);
+
+ return 0;
+}
+
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg) {
+ LIBSYS_UNUSED(attr);
+
+ /// @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;
+}
+