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

Re: [Minios-devel] [UNIKRAFT PATCH v4 11/12] lib/uksched: Add re-entrancy support for newlib



Hi Costin,

this looks good, thanks.

Cheers,
Florian

On 3/22/19 3:16 PM, Costin Lupu wrote:
Re-entrancy in newlib is provided by mapping a _reent attribute to
each thread. The attribute encapsulates the global state specific
to each thread (e.g. errno, standard IO streams, signal state, etc).

Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>

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

---
  lib/uksched/exportsyms.uk       |  3 +++
  lib/uksched/include/uk/thread.h |  4 ++--
  lib/uksched/thread.c            | 29 +++++++++++++++++++++++++++--
  3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/lib/uksched/exportsyms.uk b/lib/uksched/exportsyms.uk
index c67892c4..5297affd 100644
--- a/lib/uksched/exportsyms.uk
+++ b/lib/uksched/exportsyms.uk
@@ -30,3 +30,6 @@ uk_thread_attr_set_prio
  uk_thread_attr_get_prio
  uk_thread_attr_set_timeslice
  uk_thread_attr_get_timeslice
+
+# Newlib related
+__getreent
\ No newline at end of file
diff --git a/lib/uksched/include/uk/thread.h b/lib/uksched/include/uk/thread.h
index f3891c29..f8bdbb5e 100644
--- a/lib/uksched/include/uk/thread.h
+++ b/lib/uksched/include/uk/thread.h
@@ -30,7 +30,7 @@
#include <stdint.h>
  #include <stdbool.h>
-#ifdef CONFIG_HAVE_LIBC
+#ifdef CONFIG_LIBNEWLIBC
  #include <sys/reent.h>
  #endif
  #include <uk/arch/lcpu.h>
@@ -57,7 +57,7 @@ struct uk_thread {
        bool detached;
        struct uk_waitq waiting_threads;
        struct uk_sched *sched;
-#ifdef CONFIG_HAVE_LIBC
+#ifdef CONFIG_LIBNEWLIBC
        struct _reent reent;
  #endif
  };
diff --git a/lib/uksched/thread.c b/lib/uksched/thread.c
index 4d931a74..72adfc68 100644
--- a/lib/uksched/thread.c
+++ b/lib/uksched/thread.c
@@ -29,6 +29,7 @@
   * Thread definitions
   * Ported from Mini-OS
   */
+#include <string.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <uk/plat/config.h>
@@ -61,6 +62,30 @@ static void init_sp(unsigned long *sp, char *stack,
        stack_push(sp, (unsigned long) data);
  }
+#ifdef CONFIG_LIBNEWLIBC
+static void reent_init(struct _reent *reent)
+{
+       _REENT_INIT_PTR(reent);
+#if 0
+       /* TODO initialize basic signal handling */
+       _init_signal_r(myreent);
+#endif
+}
+
+struct _reent *__getreent(void)
+{
+       struct _reent *_reent;
+       struct uk_sched *s = uk_sched_get_default();
+
+       if (!s || !uk_sched_started(s))
+               _reent = _impure_ptr;
+       else
+               _reent = &uk_thread_current()->reent;
+
+       return _reent;
+}
+#endif /* CONFIG_LIBNEWLIBC */
+
  int uk_thread_init(struct uk_thread *thread,
                struct ukplat_ctx_callbacks *cbs, struct uk_alloc *allocator,
                const char *name, void *stack,
@@ -91,8 +116,8 @@ int uk_thread_init(struct uk_thread *thread,
        uk_waitq_init(&thread->waiting_threads);
        thread->sched = NULL;
-#ifdef CONFIG_HAVE_LIBC
-       //TODO _REENT_INIT_PTR(&thread->reent);
+#ifdef CONFIG_LIBNEWLIBC
+       reent_init(&thread->reent);
  #endif
uk_pr_info("Thread \"%s\": pointer: %p, stack: %p\n",


--
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®.