[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT/PTHREAD-EMBEDDED PATCH v2 7/8] Add missing pthread functions



Hi Costin,

looks good, thanks.

Reviewed-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>

On 6/3/19 5:16 PM, Costin Lupu wrote:
This patch adds some missing functions for updating threads attributes,
such as the thread name or the stack address and size. Currently we
support only the fixed stack size of 64KB.

These new functions are used by the Ruby interpreter.

Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
---
  Makefile.uk       |   1 +
  attributes.c      | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
  include/pthread.h |  51 ++++++++++++++++++
  3 files changed, 206 insertions(+)
  create mode 100644 attributes.c
  create mode 100644 include/pthread.h

diff --git a/Makefile.uk b/Makefile.uk
index 12c68b2..fe99760 100644
--- a/Makefile.uk
+++ b/Makefile.uk
@@ -65,6 +65,7 @@ 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
+LIBPTHREAD-EMBEDDED_SRCS-y += $(LIBPTHREAD-EMBEDDED_BASE)/attributes.c|glue
################################################################################
  # pthread-embedded code
diff --git a/attributes.c b/attributes.c
new file mode 100644
index 0000000..7729096
--- /dev/null
+++ b/attributes.c
@@ -0,0 +1,154 @@
+/* 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
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#ifdef _GNU_SOURCE
+#include <uk/arch/limits.h>
+#endif
+#include <pthread.h>
+#include <implement.h>
+
+
+/* TODO We currently do not support guards */
+int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)
+{
+       if (guardsize != 0)
+               return EINVAL;
+
+       return 0;
+}
+
+int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize)
+{
+       if (!guardsize)
+               return EINVAL;
+
+       *guardsize = 0;
+
+       return 0;
+}
+
+int pthread_attr_setstack(pthread_attr_t *attr,
+               void *stackaddr, size_t stacksize)
+{
+       int rc;
+
+       rc = pthread_attr_setstacksize(attr, stacksize);
+       if (rc)
+               goto out;
+
+       rc = pthread_attr_setstackaddr(attr, stackaddr);
+
+out:
+       return rc;
+}
+
+int pthread_attr_getstack(const pthread_attr_t *attr,
+               void **stackaddr, size_t *stacksize)
+{
+       int rc;
+
+       rc = pthread_attr_getstacksize(attr, stacksize);
+       if (rc)
+               goto out;
+
+       rc = pthread_attr_getstackaddr(attr, stackaddr);
+
+out:
+       return rc;
+}
+
+#ifdef _GNU_SOURCE
+int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr)
+{
+       pte_thread_t *tp = (pte_thread_t *) thread.p;
+       struct uk_thread *_uk_thread;
+       pthread_attr_t _attr;
+       prio_t prio;
+       int rc;
+
+       if (tp == NULL || tp->threadId == NULL)
+               return ENOENT;
+
+       if (attr == NULL || *attr == NULL)
+               return EINVAL;
+
+       _uk_thread = tp->threadId;
+       _attr = *attr;
+       _attr->stackaddr = _uk_thread->stack;
+       _attr->stacksize = __STACK_SIZE;
+
+       _attr->detachstate = (_uk_thread->detached
+               ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE);
+
+       rc = uk_thread_get_prio(_uk_thread, &prio);
+       if (rc == 0)
+               _attr->param.sched_priority = prio;
+
+       /* TODO inheritsched and contentionscope */
+
+       return 0;
+}
+
+int pthread_setname_np(pthread_t thread, const char *name)
+{
+       pte_thread_t *tp = (pte_thread_t *) thread.p;
+       struct uk_thread *_uk_thread;
+       size_t len;
+
+       if (tp == NULL || tp->threadId == NULL)
+               return ENOENT;
+
+       _uk_thread = tp->threadId;
+
+       len = strnlen(name, 16);
+       if (len > 15)
+               return ERANGE;
+
+       _uk_thread->name = name;
+
+       return 0;
+}
+
+int pthread_getname_np(pthread_t thread, char *name, size_t len)
+{
+       pte_thread_t *tp = (pte_thread_t *) thread.p;
+       struct uk_thread *_uk_thread;
+       size_t _len;
+
+       if (tp == NULL || tp->threadId == NULL)
+               return ENOENT;
+
+       _uk_thread = tp->threadId;
+
+       _len = strlen(_uk_thread->name);
+       if (len < _len + 1)
+               return ERANGE;
+
+       sprintf(name, _uk_thread->name);
+
+       return 0;
+}
+
+#endif /* _GNU_SOURCE */
diff --git a/include/pthread.h b/include/pthread.h
new file mode 100644
index 0000000..8cd1ade
--- /dev/null
+++ b/include/pthread.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: LGPL-2.0-or-later */
+/*
+ *      Unikraft port of POSIX Threads Library for embedded systems
+ *      Copyright(C) 2019, 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
+ */
+
+#ifndef __GLUE_PTHREAD_H__
+#define __GLUE_PTHREAD_H__
+
+#include_next <pthread.h>
+
+/* C functions not implemented in pthread-embedded */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
+int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);
+
+int pthread_attr_setstack(pthread_attr_t *attr,
+               void *stackaddr, size_t stacksize);
+int pthread_attr_getstack(const pthread_attr_t *attr,
+               void **stackaddr, size_t *stacksize);
+
+#ifdef _GNU_SOURCE
+int pthread_getattr_np(pthread_t thread, pthread_attr_t *attr);
+
+int pthread_setname_np(pthread_t thread, const char *name);
+int pthread_getname_np(pthread_t thread, char *name, size_t len);
+#endif /* _GNU_SOURCE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GLUE_PTHREAD_H__ */


--
Dr. Florian Schmidt
フローリアン・シュミット
Research Scientist,
Systems and Machine Learning Group
NEC Laboratories Europe
Kurfürsten-Anlage 36, D-69115 Heidelberg
Tel.     +49 (0)6221 4342-265
Fax:     +49 (0)6221 4342-155
e-mail:  florian.schmidt@xxxxxxxxx
============================================================
Registered at Amtsgericht Mannheim, Germany, HRB728558

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.