[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |