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

Re: [Minios-devel] [UNIKRAFT PATCH 6/8] lib/uksched: Add support for waiting threads



Hi,


>Similar to waiting processes, we introduce support for waiting
>threads. This is the conventional way of getting notified by
>threads termination events and freeing the threads resources upon
>exit.

s/by threads termination/by thread termination
s/freeing the threads/freeing thread

>A thread can be waited by other threads. If no such behaviour is
>desired then one should set the detached attribute for the thread.
>This implies that the thread resources will be automatically freed
>when the thread exits.

s/waited by/waited on by

>Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
>---
> lib/uksched/exportsyms.uk       |  3 +++
> lib/uksched/include/uk/thread.h |  6 +++++
> lib/uksched/thread.c            | 55
>+++++++++++++++++++++++++++++++++++++++++
> lib/ukschedcoop/schedcoop.c     |  7 ++++++
> 4 files changed, 71 insertions(+)
>
>diff --git a/lib/uksched/exportsyms.uk b/lib/uksched/exportsyms.uk
>index 951cd20..22c8913 100644
>--- a/lib/uksched/exportsyms.uk
>+++ b/lib/uksched/exportsyms.uk
>@@ -14,6 +14,9 @@ uk_thread_fini
> uk_thread_block_timeout
> uk_thread_block
> uk_thread_wake
>+uk_thread_exit
>+uk_thread_wait
>+uk_thread_detach
> uk_thread_set_prio
> uk_thread_get_prio
> uk_thread_set_timeslice
>diff --git a/lib/uksched/include/uk/thread.h
>b/lib/uksched/include/uk/thread.h
>index 7a1b630..3267ab2 100644
>--- a/lib/uksched/include/uk/thread.h
>+++ b/lib/uksched/include/uk/thread.h
>@@ -36,6 +36,7 @@
> #include <uk/arch/time.h>
> #include <uk/plat/thread.h>
> #include <uk/thread_attr.h>
>+#include <uk/wait_types.h>
> #include <uk/list.h>
> #include <uk/essentials.h>
> 
>@@ -52,6 +53,7 @@ struct uk_thread {
>       UK_TAILQ_ENTRY(struct uk_thread) thread_list;
>       uint32_t flags;
>       __snsec wakeup_time;
>+      struct uk_waitq waiting_threads;
>       struct uk_sched *sched;
>       void *sched_info;
> #ifdef CONFIG_HAVE_LIBC
>@@ -68,6 +70,10 @@ UK_TAILQ_HEAD(uk_thread_list, struct uk_thread);
>       uk_thread_create_attr(name, NULL, function, data)
> #define uk_thread_destroy(thread) \
>       uk_sched_thread_destroy(thread->sched, thread)
>+void uk_thread_exit(struct uk_thread *thread);
>+
>+int uk_thread_wait(struct uk_thread *thread);
>+int uk_thread_detach(struct uk_thread *thread);
> 
> int uk_thread_set_prio(struct uk_thread *thread, prio_t prio);
> int uk_thread_get_prio(const struct uk_thread *thread, prio_t *prio);
>diff --git a/lib/uksched/thread.c b/lib/uksched/thread.c
>index 3e69cfe..a06e338 100644
>--- a/lib/uksched/thread.c
>+++ b/lib/uksched/thread.c
>@@ -36,6 +36,7 @@
> #include <uk/thread.h>
> #include <uk/_thread_info.h>
> #include <uk/sched.h>
>+#include <uk/wait.h>
> #include <uk/print.h>
> #include <uk/assert.h>
> 
>@@ -87,6 +88,7 @@ int uk_thread_init(struct uk_thread *thread,
>       /* Not runnable, not exited, not sleeping */
>       thread->flags = 0;
>       thread->wakeup_time = 0LL;
>+      uk_waitq_init(&thread->waiting_threads);
>       thread->sched_info = NULL;
> 
> #ifdef CONFIG_HAVE_LIBC
>@@ -132,6 +134,59 @@ void uk_thread_wake(struct uk_thread *thread)
>       set_runnable(thread);
> }
> 
>+void uk_thread_exit(struct uk_thread *thread)
>+{
>+      struct thread_info_base *tib;
>+
>+      UK_ASSERT(thread);
>+      UK_ASSERT(thread->sched);
>+
>+      set_exited(thread);
>+
>+      tib = thread->sched_info;
>+
>+      if (!tib->is_detached)
>+              uk_waitq_wake_up(&thread->waiting_threads);
>+
>+      uk_printd(DLVL_EXTRA, "Thread \"%s\" exited.\n", thread->name);
>+}
>+
>+int uk_thread_wait(struct uk_thread *thread)
>+{
>+      struct thread_info_base *tib;
>+
>+      UK_ASSERT(thread);
>+      UK_ASSERT(thread->sched);
>+
>+      tib = thread->sched_info;
>+
>+      /* TODO critical region */

Is this coming in v2 of these series? :) Seems like a fairly important
TODO.

>+
>+      if (tib->is_detached)
>+              return -1;
>+
>+      uk_waitq_wait_event(&thread->waiting_threads, is_exited(thread));
>+
>+      tib->is_detached = 1;
>+
>+      uk_sched_thread_destroy(thread->sched, thread);
>+
>+      return 0;
>+}
>+
>+int uk_thread_detach(struct uk_thread *thread)
>+{
>+      struct thread_info_base *tib;
>+
>+      UK_ASSERT(thread);
>+      UK_ASSERT(thread->sched);
>+
>+      tib = thread->sched_info;
>+      tib->is_detached = 1;
>+
>+      return 0;
>+}

As in previous patches, please use macros.

>+
> int uk_thread_set_prio(struct uk_thread *thread, prio_t prio)
> {
>       if (!thread)
>diff --git a/lib/ukschedcoop/schedcoop.c b/lib/ukschedcoop/schedcoop.c
>index a2bf2ad..0a735bd 100644
>--- a/lib/ukschedcoop/schedcoop.c
>+++ b/lib/ukschedcoop/schedcoop.c
>@@ -124,6 +124,12 @@ static void schedcoop_schedule(struct uk_sched *s)
>               uk_sched_thread_switch(s, prev, next);
> 
>       UK_TAILQ_FOREACH_SAFE(thread, &s->exited_threads, thread_list, tmp) {
>+              struct thread_info_base *tib = thread->sched_info;
>+
>+              if (!tib->is_detached)
>+                      /* someone will eventually wait for it */
>+                      continue;
>+
>               if (thread != prev)
>                       uk_thread_destroy(thread);
>       }
>@@ -163,6 +169,7 @@ static void schedcoop_thread_remove(struct uk_sched
>*s, struct uk_thread *t)
> 
>       /* Put onto exited list */
>       UK_TAILQ_INSERT_HEAD(&s->exited_threads, t, thread_list);
>+      uk_thread_exit(t);
> 
>       ukplat_lcpu_restore_irqf(flags);
> 
>-- 
>2.11.0
>

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