From 69ca9cfd78da8e27a958db1656b75bb9d1886e85 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 13 Nov 2019 21:49:24 +0100 Subject: LibPthread: Start working on a POSIX threading library This patch adds pthread_create() and pthread_exit(), which currently simply wrap our existing create_thread() and exit_thread() syscalls. LibThread is also ported to using LibPthread. --- Libraries/LibPthread/Makefile | 19 +++++++++++ Libraries/LibPthread/install.sh | 9 +++++ Libraries/LibPthread/pthread.cpp | 24 +++++++++++++ Libraries/LibPthread/pthread.h | 74 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 Libraries/LibPthread/Makefile create mode 100755 Libraries/LibPthread/install.sh create mode 100644 Libraries/LibPthread/pthread.cpp create mode 100644 Libraries/LibPthread/pthread.h (limited to 'Libraries/LibPthread') diff --git a/Libraries/LibPthread/Makefile b/Libraries/LibPthread/Makefile new file mode 100644 index 0000000000..993ee2cdb9 --- /dev/null +++ b/Libraries/LibPthread/Makefile @@ -0,0 +1,19 @@ +include ../../Makefile.common + +OBJS = pthread.o + +LIBRARY = libpthread.a +DEFINES += -DUSERLAND + +all: $(LIBRARY) + +$(LIBRARY): $(OBJS) + @echo "LIB $@"; $(AR) rcs $@ $(OBJS) + +.cpp.o: + @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJS:%.o=%.d) + +clean: + @echo "CLEAN"; rm -f $(LIBRARY) $(OBJS) *.d diff --git a/Libraries/LibPthread/install.sh b/Libraries/LibPthread/install.sh new file mode 100755 index 0000000000..4a7d00c6d1 --- /dev/null +++ b/Libraries/LibPthread/install.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e +SERENITY_ROOT=../../ + +mkdir -p $SERENITY_ROOT/Root/usr/include/sys/ +mkdir -p $SERENITY_ROOT/Root/usr/lib/ +cp ./*.h $SERENITY_ROOT/Root/usr/include/ +cp libpthread.a $SERENITY_ROOT/Root/usr/lib/ diff --git a/Libraries/LibPthread/pthread.cpp b/Libraries/LibPthread/pthread.cpp new file mode 100644 index 0000000000..26761b8a02 --- /dev/null +++ b/Libraries/LibPthread/pthread.cpp @@ -0,0 +1,24 @@ +#include +#include +#include + +extern "C" { + +int pthread_create(pthread_t* thread, pthread_attr_t* attributes, void *(*start_routine)(void*), void* argument_to_start_routine) +{ + if (!thread) + return -EINVAL; + UNUSED_PARAM(attributes); + int rc = create_thread(start_routine, argument_to_start_routine); + if (rc < 0) + return rc; + *thread = rc; + return 0; +} + +void pthread_exit(void* value_ptr) +{ + exit_thread(value_ptr); +} + +} diff --git a/Libraries/LibPthread/pthread.h b/Libraries/LibPthread/pthread.h new file mode 100644 index 0000000000..19e6f88f19 --- /dev/null +++ b/Libraries/LibPthread/pthread.h @@ -0,0 +1,74 @@ +#pragma once + +#include +#include + +__BEGIN_DECLS + +typedef int pthread_t; +typedef void* pthread_key_t; +typedef void* pthread_once_t; +typedef void* pthread_mutex_t; +typedef void* pthread_attr_t; +typedef void* pthread_mutexattr_t; +typedef void* pthread_cond_t; +typedef void* pthread_spinlock_t; +typedef void* pthread_condattr_t; + +int pthread_create(pthread_t*, pthread_attr_t*, void* (*)(void*), void*); +void pthread_exit(void*); +int pthread_kill(pthread_t, int); +void pthread_cleanup_push(void (*)(void*), void*); +void pthread_cleanup_pop(int); +int pthread_join(pthread_t, void**); +int pthread_mutex_lock(pthread_mutex_t*); +int pthread_mutex_trylock(pthread_mutex_t* mutex); +int pthread_mutex_unlock(pthread_mutex_t*); +int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*); +int pthread_mutex_destroy(pthread_mutex_t*); +int pthread_attr_init(pthread_attr_t*); +int pthread_attr_destroy(pthread_attr_t*); + +int pthread_once(pthread_once_t*, void (*)(void)); +#define PTHREAD_ONCE_INIT 0 +void* pthread_getspecific(pthread_key_t key); +int pthread_setspecific(pthread_key_t key, const void* value); + +#define PTHREAD_MUTEX_NORMAL 0 +#define PTHREAD_MUTEX_RECURSIVE 1 +#define PTHREAD_MUTEX_INITIALIZER 0 +#define PTHREAD_COND_INITIALIZER 0 + +int pthread_key_create(pthread_key_t* key, void (*destructor)(void*)); +int pthread_key_delete(pthread_key_t key); +int pthread_cond_broadcast(pthread_cond_t*); +int pthread_cond_init(pthread_cond_t*, const pthread_condattr_t*); +int pthread_cond_signal(pthread_cond_t*); +int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*); +int pthread_condattr_destroy(pthread_condattr_t*); +int pthread_cancel(pthread_t); +void pthread_cleanup_push(void (*)(void*), void*); +void pthread_cleanup_pop(int); +int pthread_cond_broadcast(pthread_cond_t*); +int pthread_cond_destroy(pthread_cond_t*); +int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, const struct timespec*); +int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*); +int pthread_condattr_destroy(pthread_condattr_t*); + +void pthread_testcancel(void); + +int pthread_spin_destroy(pthread_spinlock_t*); +int pthread_spin_init(pthread_spinlock_t*, int); +int pthread_spin_lock(pthread_spinlock_t*); +int pthread_spin_trylock(pthread_spinlock_t*); +int pthread_spin_unlock(pthread_spinlock_t*); +int pthread_cond_destroy(pthread_cond_t*); +pthread_t pthread_self(void); +int pthread_detach(pthread_t); +int pthread_equal(pthread_t, pthread_t); +void pthread_exit(void*); +int pthread_mutexattr_init(pthread_mutexattr_t*); +int pthread_mutexattr_settype(pthread_mutexattr_t*, int); +int pthread_mutexattr_destroy(pthread_mutexattr_t*); + +__END_DECLS -- cgit v1.2.3