[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT/PTHREAD-EMBEDDED PATCH v2 4/8] Initial port of pthread-embedded to Unikraft
This is our initial port of pthread-embedded to Unikraft as external library. For now you need newlib to make it work. When adding the library in the dependency list, pthread-embedded should stay before newlib (e.g. ...:$(UK_LIBS)/pthread-embedded:$(UK_LIBS)/newlib.git:...). Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> --- Config.uk | 30 +++ Makefile.uk | 327 ++++++++++++++++++++++++++ README.md | 10 + exportsyms.uk | 90 ++++++++ include/pte_osal.h | 16 ++ include/pte_types.h | 10 + include/sys/_pthreadtypes.h | 6 + pte_osal.c | 542 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 1031 insertions(+) create mode 100644 Config.uk create mode 100644 Makefile.uk create mode 100644 exportsyms.uk create mode 100644 include/pte_osal.h create mode 100644 include/pte_types.h create mode 100644 include/sys/_pthreadtypes.h create mode 100644 pte_osal.c diff --git a/Config.uk b/Config.uk new file mode 100644 index 0000000..3587c55 --- /dev/null +++ b/Config.uk @@ -0,0 +1,30 @@ +menuconfig LIBPTHREAD_EMBEDDED + bool "libpthread-embedded - An embedded pthread library" + default n + select LIBNOLIBC if !HAVE_LIBC + select LIBUKDEBUG + select LIBUKALLOC + select LIBUKSCHED + select LIBUKLOCK + select LIBUKLOCK_MUTEX + select LIBUKLOCK_SEMAPHORE + +if LIBPTHREAD_EMBEDDED +config LIBPTHREAD_EMBEDDED_MAX_SIMUL_THREADS + int "Maximum number of simultaneous threads" + default 32 + help + Maximum number of simultaneous threads. + +config LIBPTHREAD_EMBEDDED_MAX_TLS + int "Maximum number of TLS values" + default 32 + help + Maximum number of supported TLS values. + +config LIBPTHREAD_EMBEDDED_UTEST + bool "Build unit tests" + default n + help + Builds the unit tests for running them from an external application. +endif diff --git a/Makefile.uk b/Makefile.uk new file mode 100644 index 0000000..12c68b2 --- /dev/null +++ b/Makefile.uk @@ -0,0 +1,327 @@ +# +# Unikraft port of POSIX Threads Library for embedded systems +# Copyright(C) 2019 Costin Lupu, University Politehnica of Bucharest +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library in the file COPYING.LIB; +# if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +################################################################################ +# Library registration +################################################################################ +$(eval $(call addlib_s,libpthread-embedded,$(CONFIG_LIBPTHREAD_EMBEDDED))) + +################################################################################ +# Sources +################################################################################ +LIBPTHREAD-EMBEDDED_VERSION=44b41d760a433915d70a7be9809651b0a65e001d +LIBPTHREAD-EMBEDDED_URL=https://github.com/RWTH-OS/pthread-embedded/archive/$(LIBPTHREAD-EMBEDDED_VERSION).zip +LIBPTHREAD-EMBEDDED_PATCHDIR=$(LIBPTHREAD-EMBEDDED_BASE)/patches +$(eval $(call fetch,libpthread-embedded,$(LIBPTHREAD-EMBEDDED_URL))) +$(eval $(call patch,libpthread-embedded,$(LIBPTHREAD-EMBEDDED_PATCHDIR),pthread-embedded-$(LIBPTHREAD-EMBEDDED_VERSION))) + +################################################################################ +# Helpers +################################################################################ +LIBPTHREAD-EMBEDDED_EXTRACTED = $(LIBPTHREAD-EMBEDDED_ORIGIN)/pthread-embedded-$(LIBPTHREAD-EMBEDDED_VERSION) + +################################################################################ +# Library includes +################################################################################ +CINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_BASE)/include +CINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_EXTRACTED) +CINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_EXTRACTED)/platform/helper + +CXXINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_BASE)/include +CXXINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_EXTRACTED) +CXXINCLUDES-$(CONFIG_LIBPTHREAD_EMBEDDED) += -I$(LIBPTHREAD-EMBEDDED_EXTRACTED)/platform/helper + +################################################################################ +# Global flags +################################################################################ +SUPPRESS_FLAGS += -Wno-unused-parameter \ +-Wno-pointer-to-int-cast -Wno-int-to-pointer-cast \ +-Wno-unused-variable -Wno-unused-value -Wno-unused-function \ +-Wno-missing-field-initializers + +LIBPTHREAD-EMBEDDED_CFLAGS-y += $(SUPPRESS_FLAGS) +LIBPTHREAD-EMBEDDED_CXXFLAGS-y += $(SUPPRESS_FLAGS) + +LIBPTHREAD-EMBEDDED_EXPORTS = $(LIBPTHREAD-EMBEDDED_BASE)/exportsyms.uk + +################################################################################ +# OS dependencies code - Glue between Unikraft and pthread-embedded +################################################################################ +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_BASE)/pte_osal.c|glue + +################################################################################ +# pthread-embedded code +################################################################################ +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/cleanup.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/create.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/global.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/platform/helper/tls-helper.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_callUserDestroyRoutines.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_cancellable_wait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_cond_check_need_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_detach.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_getprocessors.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_is_attr.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_mutex_check_need_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_new.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_relmillisecs.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_reuse.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_rwlock_cancelwrwait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_rwlock_check_need_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_spinlock_check_need_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_threadDestroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_threadStart.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_throw.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_tkAssocCreate.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pte_tkAssocDestroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getdetachstate.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getinheritsched.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getschedparam.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getschedpolicy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getscope.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getstackaddr.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_getstacksize.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setdetachstate.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setinheritsched.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setschedparam.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setschedpolicy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setscope.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setstackaddr.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_attr_setstacksize.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrierattr_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrierattr_getpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrierattr_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrierattr_setpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrier_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrier_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_barrier_wait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_cancel.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_condattr_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_condattr_getpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_condattr_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_condattr_setpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_cond_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_cond_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_cond_signal.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_cond_wait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_delay_np.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_detach.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_equal.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_exit.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_getconcurrency.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_getschedparam.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_getspecific.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_join.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_key_create.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_key_delete.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_kill.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_getkind_np.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_getpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_gettype.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_setkind_np.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_setpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutexattr_settype.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_lock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_timedlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_trylock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_mutex_unlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_num_processors_np.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_once.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlockattr_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlockattr_getpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlockattr_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlockattr_setpshared.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_rdlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_timedrdlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_timedwrlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_tryrdlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_trywrlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_unlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_rwlock_wrlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_self.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_setcancelstate.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_setcanceltype.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_setconcurrency.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_setschedparam.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_setspecific.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_spin_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_spin_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_spin_lock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_spin_trylock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_spin_unlock.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_terminate.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_testcancel.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/pthread_timechange_handler_np.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sched_get_priority_max.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sched_get_priority_min.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sched_setscheduler.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sched_yield.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_close.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_destroy.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_getvalue.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_init.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_open.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_post_multiple.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_post.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_timedwait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_trywait.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_unlink.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/sem_wait.c + +ifeq ($(CONFIG_LIBPTHREAD_EMBEDDED_UTEST),y) +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/barrier1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/barrier2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/barrier3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/barrier4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/barrier5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchlib.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchtest1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchtest2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchtest3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchtest4.c +#LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/benchtest5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel6a.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cancel6d.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cleanup0.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cleanup1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cleanup2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/cleanup3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar1_1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar1_2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar2_1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar3_1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar3_2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar3_3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar6.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar7.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar8.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/condvar9.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/count1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/create1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/create2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/create3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/delay1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/delay2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/detach1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/equal1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/errno1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exception1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exception2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exception3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exit1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exit2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exit3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exit4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/exit5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/inherit1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/join0.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/join1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/join2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/join3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/join4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/kill1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex1e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex1n.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex1r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex2e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex2r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex3e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex3r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6es.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6n.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6rs.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex6s.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex7.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex7e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex7n.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex7r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex8.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex8e.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex8n.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/mutex8r.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/once1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/once2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/once3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/once4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/priority1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/priority2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/reuse1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/reuse2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock2_t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock3_t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock4_t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock5_t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock6.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock6_t2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock6_t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock7.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/rwlock8.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/self1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/self2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore4t.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore5.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/semaphore6.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/spin1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/spin2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/spin3.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/spin4.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/stress1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/test_main.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/tsd1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/tsd2.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/valid1.c +LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_EXTRACTED)/tests/valid2.c +endif diff --git a/README.md b/README.md index 2ecc239..b9eb580 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ pthread-embedded for Unikraft ============================= +This is the port of pthread-embedded for Unikraft as external library. You will +need newlib to make it work. When adding the library in the dependency list, +pthread-embedded should stay before newlib, e.g.: + + `...:$(UK_LIBS)/pthread-embedded:$(UK_LIBS)/newlib:...` + +For running the unit tests, enable the 'Build unit tests' option in the +configuration menu and call the `pte_test_main()` function in your main +application. + Please refer to the `README.md` as well as the documentation in the `doc/` subdirectory of the main unikraft repository. diff --git a/exportsyms.uk b/exportsyms.uk new file mode 100644 index 0000000..24b5c02 --- /dev/null +++ b/exportsyms.uk @@ -0,0 +1,90 @@ +pthread_init +pthread_terminate +pthread_attr_init +pthread_attr_destroy +pthread_attr_getdetachstate +pthread_attr_getstackaddr +pthread_attr_getstacksize +pthread_attr_setdetachstate +pthread_attr_setstackaddr +pthread_attr_setstacksize +pthread_attr_getschedparam +pthread_attr_setschedparam +pthread_attr_setschedpolicy +pthread_attr_getschedpolicy +pthread_attr_setinheritsched +pthread_attr_getinheritsched +pthread_attr_setscope +pthread_attr_getscope +pthread_create +pthread_detach +pthread_equal +pthread_exit +pthread_join +pthread_self +pthread_cancel +pthread_setcancelstate +pthread_setcanceltype +pthread_testcancel +pthread_once +pthread_key_create +pthread_key_delete +pthread_setspecific +pthread_getspecific +pthread_mutexattr_init +pthread_mutexattr_destroy +pthread_mutexattr_getpshared +pthread_mutexattr_setpshared +pthread_mutexattr_settype +pthread_mutexattr_gettype +pthread_barrierattr_init +pthread_barrierattr_destroy +pthread_barrierattr_getpshared +pthread_barrierattr_setpshared +pthread_mutex_init +pthread_mutex_destroy +pthread_mutex_lock +pthread_mutex_timedlock +pthread_mutex_trylock +pthread_mutex_unlock +pthread_spin_init +pthread_spin_destroy +pthread_spin_lock +pthread_spin_trylock +pthread_spin_unlock +pthread_barrier_init +pthread_barrier_destroy +pthread_barrier_wait +pthread_condattr_init +pthread_condattr_destroy +pthread_condattr_getpshared +pthread_condattr_setpshared +pthread_cond_init +pthread_cond_destroy +pthread_cond_wait +pthread_cond_timedwait +pthread_cond_signal +pthread_cond_broadcast +pthread_setschedparam +pthread_getschedparam +pthread_setconcurrency +pthread_getconcurrency +pthread_rwlock_init +pthread_rwlock_destroy +pthread_rwlock_tryrdlock +pthread_rwlock_trywrlock +pthread_rwlock_rdlock +pthread_rwlock_timedrdlock +pthread_rwlock_wrlock +pthread_rwlock_timedwrlock +pthread_rwlock_unlock +pthread_rwlockattr_init +pthread_rwlockattr_destroy +pthread_rwlockattr_getpshared +pthread_rwlockattr_setpshared +pthread_kill +sched_yield +sched_get_priority_min +sched_get_priority_max +sched_setscheduler +pte_test_main diff --git a/include/pte_osal.h b/include/pte_osal.h new file mode 100644 index 0000000..bcf5374 --- /dev/null +++ b/include/pte_osal.h @@ -0,0 +1,16 @@ +#ifndef __PTE_OSAL_H__ +#define __PTE_OSAL_H__ + +#include <uk/mutex.h> +#include <uk/semaphore.h> + +typedef struct uk_thread* pte_osThreadHandle; +typedef struct uk_semaphore *pte_osSemaphoreHandle; +typedef struct uk_mutex *pte_osMutexHandle; + +#define OS_MAX_SIMUL_THREADS \ + CONFIG_LIBPTHREAD_EMBEDDED_MAX_SIMUL_THREADS + +#include "pte_generic_osal.h" + +#endif /* __PTE_OSAL_H__ */ diff --git a/include/pte_types.h b/include/pte_types.h new file mode 100644 index 0000000..c9081fa --- /dev/null +++ b/include/pte_types.h @@ -0,0 +1,10 @@ +#ifndef __PTE_TYPES_H__ +#define __PTE_TYPES_H__ + +#include <sys/timeb.h> + +typedef unsigned int tid_t; + +typedef int pid_t; + +#endif /* __PTE_TYPES_H__ */ diff --git a/include/sys/_pthreadtypes.h b/include/sys/_pthreadtypes.h new file mode 100644 index 0000000..ed987b6 --- /dev/null +++ b/include/sys/_pthreadtypes.h @@ -0,0 +1,6 @@ +#ifndef _SYS__PTHREADTYPES_H_ +#define _SYS__PTHREADTYPES_H_ + +#include <pthread.h> + +#endif /* _SYS__PTHREADTYPES_H_ */ diff --git a/pte_osal.c b/pte_osal.c new file mode 100644 index 0000000..5cbc0a2 --- /dev/null +++ b/pte_osal.c @@ -0,0 +1,542 @@ +/* SPDX-License-Identifier: LGPL-2.0-or-later */ +/* + * Unikraft port of POSIX Threads Library for embedded systems + * Copyright(C) 2019 Costin Lupu, University Politehnica of Bucharest + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +/* + * This port is derived from hermit/pte_osal.c. + */ + +#include <string.h> +#include <uk/essentials.h> +#include <uk/arch/time.h> +#include <uk/arch/atomic.h> +#include <uk/print.h> +#include <uk/thread.h> +#include "pte_osal.h" +#include "pthread.h" +#include "tls-helper.h" + + +typedef struct { + /* thread routine */ + pte_osThreadEntryPoint entry_point; + /* thread routine arguments */ + void *argv; + /* Unikraft thread */ + struct uk_thread *uk_thread; + /* TLS */ + void *tls; + /* Semaphore for triggering thread start */ + struct uk_semaphore start_sem; + /* Semaphore for cancellation */ + struct uk_semaphore cancel_sem; + /* Is non-zero if thread exited */ + int done; +} pte_thread_data_t; + + +/**************************************************************************** + * + * Initialization + * + ***************************************************************************/ + +int __constructor pthread_constructor(void) +{ + uk_pr_debug("pthread-embedded constructor\n"); + return pthread_init(); +} + +pte_osResult pte_osInit(void) +{ + pte_osResult result = PTE_OS_OK; + pte_thread_data_t *ptd; + struct uk_thread *crnt; + + /* Allocate and initialize TLS support */ + result = pteTlsGlobalInit(CONFIG_LIBPTHREAD_EMBEDDED_MAX_TLS); + if (result != PTE_OS_OK) { + uk_pr_err("Could not init global TLS"); + goto out; + } + + /* Create a ptd for initializing thread. */ + ptd = calloc(1, sizeof(pte_thread_data_t)); + if (ptd == NULL) { + result = PTE_OS_NO_RESOURCES; + goto out; + } + + ptd->tls = pteTlsThreadInit(); + if (ptd->tls == NULL) { + uk_pr_err("Could not init TLS"); + free(ptd); + result = PTE_OS_NO_RESOURCES; + goto out; + } + + crnt = uk_thread_current(); + crnt->prv = ptd; + ptd->uk_thread = crnt; + +out: + return result; +} + +/**************************************************************************** + * + * Threads + * + ***************************************************************************/ + +static pte_thread_data_t *handle_to_ptd(pte_osThreadHandle h) +{ + return h->prv; +} + +static pte_thread_data_t *current_ptd(void) +{ + return uk_thread_current()->prv; +} + +static void uk_stub_thread_entry(void *argv) +{ + pte_thread_data_t *ptd = (pte_thread_data_t *) argv; + + /* wait for the resume command */ + uk_semaphore_down(&ptd->start_sem); + + ptd->entry_point(ptd->argv); +} + +pte_osResult pte_osThreadCreate(pte_osThreadEntryPoint entry_point, + int stack_size, int initial_prio, void *argv, + pte_osThreadHandle *ph) +{ + pte_thread_data_t *ptd; + + ptd = malloc(sizeof(pte_thread_data_t)); + if (!ptd) + return PTE_OS_NO_RESOURCES; + + ptd->entry_point = entry_point; + ptd->argv = argv; + + /* Allocate TLS structure for this thread. */ + ptd->tls = pteTlsThreadInit(); + if (ptd->tls == NULL) { + uk_pr_err("Could not allocate TLS\n"); + free(ptd); + return PTE_OS_NO_RESOURCES; + } + + uk_semaphore_init(&ptd->start_sem, 0); + uk_semaphore_init(&ptd->cancel_sem, 0); + ptd->done = 0; + + ptd->uk_thread = uk_thread_create_attr(NULL, NULL, + uk_stub_thread_entry, ptd); + if (ptd->uk_thread == NULL) { + pteTlsThreadDestroy(ptd->tls); + free(ptd); + return PTE_OS_NO_RESOURCES; + } + + ptd->uk_thread->prv = ptd; + + *ph = ptd->uk_thread; + + return PTE_OS_OK; +} + +pte_osResult pte_osThreadStart(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + + /* wake up thread */ + uk_semaphore_up(&ptd->start_sem); + + return 0; +} + +pte_osResult pte_osThreadDelete(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + + /* free resources */ + pteTlsThreadDestroy(ptd->tls); + free(ptd); + + return PTE_OS_OK; +} + +pte_osResult pte_osThreadExitAndDelete(pte_osThreadHandle h) +{ + if (h->sched) + uk_thread_kill(h); + pte_osThreadDelete(h); + + return PTE_OS_OK; +} + +void pte_osThreadExit(void) +{ + pte_thread_data_t *ptd = current_ptd(); + + ptd->done = 1; + uk_sched_thread_exit(); +} + +pte_osResult pte_osThreadWaitForEnd(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + pte_thread_data_t *self_ptd = current_ptd(); + + while (1) { + if (ptd->done) { + uk_thread_wait(ptd->uk_thread); + return PTE_OS_OK; + } + + if (self_ptd && self_ptd->cancel_sem.count > 0) + return PTE_OS_INTERRUPTED; + + else + uk_sched_yield(); + } +} + +pte_osResult pte_osThreadCancel(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + + uk_semaphore_up(&ptd->cancel_sem); + + return PTE_OS_OK; +} + +pte_osResult pte_osThreadCheckCancel(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + + if (ptd && ptd->cancel_sem.count > 0) + return PTE_OS_INTERRUPTED; + + return PTE_OS_OK; +} + +pte_osThreadHandle pte_osThreadGetHandle(void) +{ + return uk_thread_current(); +} + +int pte_osThreadGetPriority(pte_osThreadHandle h) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + prio_t prio; + + int ret = uk_thread_get_prio(ptd->uk_thread, &prio); + + return ret ? PTE_OS_GENERAL_FAILURE : PTE_OS_OK; +} + +pte_osResult pte_osThreadSetPriority(pte_osThreadHandle h, int new_prio) +{ + pte_thread_data_t *ptd = handle_to_ptd(h); + + int ret = uk_thread_set_prio(ptd->uk_thread, new_prio); + + return ret ? PTE_OS_GENERAL_FAILURE : PTE_OS_OK; +} + +void pte_osThreadSleep(unsigned int msecs) +{ + __nsec nsec = ukarch_time_msec_to_nsec(msecs); + + uk_sched_thread_sleep(nsec); +} + +int pte_osThreadGetMinPriority(void) +{ + return UK_THREAD_ATTR_PRIO_MIN; +} + +int pte_osThreadGetMaxPriority(void) +{ + return UK_THREAD_ATTR_PRIO_MAX; +} + +int pte_osThreadGetDefaultPriority(void) +{ + return UK_THREAD_ATTR_PRIO_DEFAULT; +} + +/**************************************************************************** + * + * Mutexes + * + ****************************************************************************/ + +pte_osResult pte_osMutexCreate(pte_osMutexHandle *ph) +{ + struct uk_mutex *m; + + if (!ph) + return PTE_OS_INVALID_PARAM; + + m = malloc(sizeof(struct uk_mutex)); + if (!m) + return PTE_OS_NO_RESOURCES; + + uk_mutex_init(m); + + *ph = m; + + return PTE_OS_OK; +} + +pte_osResult pte_osMutexDelete(pte_osMutexHandle h) +{ + if (!h) + return PTE_OS_INVALID_PARAM; + + free(h); + + return PTE_OS_OK; +} + +pte_osResult pte_osMutexLock(pte_osMutexHandle h) +{ + if (!h) + return PTE_OS_INVALID_PARAM; + + uk_mutex_lock(h); + + return PTE_OS_OK; +} + +pte_osResult pte_osMutexTimedLock(pte_osMutexHandle h, + unsigned int timeoutMsecs) +{ + return PTE_OS_GENERAL_FAILURE; +} + + +pte_osResult pte_osMutexUnlock(pte_osMutexHandle h) +{ + if (!h) + return PTE_OS_INVALID_PARAM; + + uk_mutex_unlock(h); + + return PTE_OS_OK; +} + +/**************************************************************************** + * + * Semaphores + * + ***************************************************************************/ + +pte_osResult pte_osSemaphoreCreate(int init_value, pte_osSemaphoreHandle *ph) +{ + struct uk_semaphore *s; + + if (!ph) + return PTE_OS_INVALID_PARAM; + + s = malloc(sizeof(struct uk_semaphore)); + if (!s) + return PTE_OS_NO_RESOURCES; + + uk_semaphore_init(s, init_value); + + *ph = s; + + return PTE_OS_OK; +} + +pte_osResult pte_osSemaphoreDelete(pte_osSemaphoreHandle h) +{ + if (!h) + return PTE_OS_INVALID_PARAM; + + free(h); + + return PTE_OS_OK; +} + +pte_osResult pte_osSemaphorePost(pte_osSemaphoreHandle h, int count) +{ + int i; + + if (!h) + return PTE_OS_INVALID_PARAM; + + for (i = 0; i < count; i++) + uk_semaphore_up(h); + + return PTE_OS_OK; +} + +pte_osResult pte_osSemaphorePend(pte_osSemaphoreHandle h, + unsigned int *ptimeout_msecs) +{ + __nsec timeout; + + if (!h) + return PTE_OS_INVALID_PARAM; + + if (ptimeout_msecs) { + timeout = ukarch_time_msec_to_nsec(*ptimeout_msecs); + + if (uk_semaphore_down_to(h, timeout) == __NSEC_MAX) + return PTE_OS_TIMEOUT; + + } else + uk_semaphore_down(h); + + return PTE_OS_OK; +} + +pte_osResult pte_osSemaphoreCancellablePend(pte_osSemaphoreHandle h, + unsigned int *ptimeout_msecs) +{ + pte_thread_data_t *ptd = current_ptd(); + pte_osResult result = PTE_OS_OK; + __nsec timeout = 0, start_time = ukplat_monotonic_clock(); + + if (ptimeout_msecs) + timeout = ukarch_time_msec_to_nsec(*ptimeout_msecs); + + while (1) { + if (uk_semaphore_down_try(h)) + /* semaphore is up */ + break; + + else if (timeout && + (ukplat_monotonic_clock() - start_time > timeout)) { + /* The timeout expired */ + result = PTE_OS_TIMEOUT; + break; + + } else if (ptd && ptd->cancel_sem.count > 0) { + /* The thread was cancelled */ + result = PTE_OS_INTERRUPTED; + break; + + } else + /* Maybe next time... */ + uk_sched_yield(); + } + + return result; +} + +/**************************************************************************** + * + * Atomic Operations + * + ***************************************************************************/ + +static int atomic_add(int *ptarg, int val) +{ + return __atomic_add_fetch(ptarg, val, __ATOMIC_SEQ_CST); +} + +int pte_osAtomicExchange(int *ptarg, int val) +{ + return ukarch_exchange_n(ptarg, val); +} + +int pte_osAtomicCompareExchange(int *pdest, int exchange, int comp) +{ + int orig = *pdest; + + ukarch_compare_exchange_sync(pdest, comp, exchange); + + return orig; +} + +int pte_osAtomicExchangeAdd(int volatile *paddend, int value) +{ + return ukarch_fetch_add(paddend, value); +} + +int pte_osAtomicDecrement(int *pdest) +{ + return atomic_add(pdest, -1); +} + +int pte_osAtomicIncrement(int *pdest) +{ + return atomic_add(pdest, 1); +} + +/**************************************************************************** + * + * Thread Local Storage + * + ***************************************************************************/ + +static void *current_tls(void) +{ + pte_thread_data_t *ptd = current_ptd(); + + return ptd ? ptd->tls : NULL; +} + +pte_osResult pte_osTlsSetValue(unsigned int key, void *value) +{ + return pteTlsSetValue(current_tls(), key, value); +} + +void *pte_osTlsGetValue(unsigned int index) +{ + return (void *) pteTlsGetValue(current_tls(), index); +} + +pte_osResult pte_osTlsAlloc(unsigned int *pkey) +{ + return pteTlsAlloc(pkey); +} + +pte_osResult pte_osTlsFree(unsigned int index) +{ + return pteTlsFree(index); +} + +/*************************************************************************** + * + * Miscellaneous + * + ***************************************************************************/ + +int ftime(struct timeb *tb) +{ + __nsec now = ukplat_monotonic_clock(); + + if (tb) { + tb->time = ukarch_time_nsec_to_sec(now); + tb->millitm = ukarch_time_nsec_to_msec(ukarch_time_subsec(now)); + } + + return 0; +} -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |