[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 5/8] lib/uksched: Revisit thread exiting logic
Hi, On 9/18/18, 5:27 PM, "Costin Lupu" <costin.lupu@xxxxxxxxx> wrote: >We use a list for terminated threads on all schedulers because it >keeps references to those threads until wait will be called for >them. s/until wait will be/until wait is The rest is fine, thanks. — Felipe >Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> >--- > lib/uksched/include/uk/sched.h | 1 + > lib/uksched/include/uk/thread.h | 4 ++++ > lib/uksched/sched.c | 7 ++++--- > lib/ukschedcoop/schedcoop.c | 11 +++-------- > 4 files changed, 12 insertions(+), 11 deletions(-) > >diff --git a/lib/uksched/include/uk/sched.h >b/lib/uksched/include/uk/sched.h >index 443dbf3..c3e2866 100644 >--- a/lib/uksched/include/uk/sched.h >+++ b/lib/uksched/include/uk/sched.h >@@ -87,6 +87,7 @@ struct uk_sched { > > /* internal */ > struct uk_thread idle; >+ struct uk_thread_list exited_threads; > struct ukplat_ctx_callbacks plat_ctx_cbs; > struct uk_alloc *allocator; > struct uk_sched *next; >diff --git a/lib/uksched/include/uk/thread.h >b/lib/uksched/include/uk/thread.h >index d28c458..7a1b630 100644 >--- a/lib/uksched/include/uk/thread.h >+++ b/lib/uksched/include/uk/thread.h >@@ -87,11 +87,15 @@ struct uk_thread *uk_thread_current(void) > } > > #define RUNNABLE_FLAG 0x00000001 >+#define EXITED_FLAG 0x00000002 > > #define is_runnable(_thread) ((_thread)->flags & RUNNABLE_FLAG) > #define set_runnable(_thread) ((_thread)->flags |= RUNNABLE_FLAG) > #define clear_runnable(_thread) ((_thread)->flags &= ~RUNNABLE_FLAG) > >+#define is_exited(_thread) ((_thread)->flags & EXITED_FLAG) >+#define set_exited(_thread) ((_thread)->flags |= EXITED_FLAG) >+ > int uk_thread_init(struct uk_thread *thread, > struct ukplat_ctx_callbacks *cbs, struct uk_alloc *allocator, > const char *name, void *stack, >diff --git a/lib/uksched/sched.c b/lib/uksched/sched.c >index 968723c..c5b7c9f 100644 >--- a/lib/uksched/sched.c >+++ b/lib/uksched/sched.c >@@ -122,6 +122,7 @@ struct uk_sched *uk_sched_create(struct uk_alloc *a, >size_t prv_size) > } > > sched->allocator = a; >+ UK_TAILQ_INIT(&sched->exited_threads); > sched->prv = (void *) sched + sizeof(struct uk_sched); > > return sched; >@@ -217,6 +218,9 @@ void uk_sched_thread_destroy(struct uk_sched *sched, >struct uk_thread *thread) > { > UK_ASSERT(sched != NULL); > UK_ASSERT(thread != NULL); >+ UK_ASSERT(is_exited(thread)); >+ >+ UK_TAILQ_REMOVE(&sched->exited_threads, thread, thread_list); > > uk_free(sched->allocator, thread->sched_info); > uk_thread_fini(thread, sched->allocator); >@@ -238,9 +242,6 @@ void uk_sched_thread_exit(void) > struct uk_thread *thread; > > thread = uk_thread_current(); >- >- uk_printd(DLVL_INFO, "Thread \"%s\" exited.\n", thread->name); >- > UK_ASSERT(thread->sched); > uk_sched_thread_remove(thread->sched, thread); > UK_CRASH("Error stopping thread."); >diff --git a/lib/ukschedcoop/schedcoop.c b/lib/ukschedcoop/schedcoop.c >index f616330..a2bf2ad 100644 >--- a/lib/ukschedcoop/schedcoop.c >+++ b/lib/ukschedcoop/schedcoop.c >@@ -37,7 +37,6 @@ > > struct schedcoop_private { > struct uk_thread_list thread_list; >- struct uk_thread_list exited_threads; > int threads_started; > }; > >@@ -124,12 +123,9 @@ static void schedcoop_schedule(struct uk_sched *s) > if (prev != next) > uk_sched_thread_switch(s, prev, next); > >- UK_TAILQ_FOREACH_SAFE(thread, &prv->exited_threads, thread_list, tmp) { >- if (thread != prev) { >- UK_TAILQ_REMOVE(&prv->exited_threads, >- thread, thread_list); >+ UK_TAILQ_FOREACH_SAFE(thread, &s->exited_threads, thread_list, tmp) { >+ if (thread != prev) > uk_thread_destroy(thread); >- } > } > } > >@@ -166,7 +162,7 @@ static void schedcoop_thread_remove(struct uk_sched >*s, struct uk_thread *t) > clear_runnable(t); > > /* Put onto exited list */ >- UK_TAILQ_INSERT_HEAD(&prv->exited_threads, t, thread_list); >+ UK_TAILQ_INSERT_HEAD(&s->exited_threads, t, thread_list); > > ukplat_lcpu_restore_irqf(flags); > >@@ -211,7 +207,6 @@ struct uk_sched *uk_schedcoop_init(struct uk_alloc *a) > ukplat_ctx_callbacks_init(&sched->plat_ctx_cbs, ukplat_ctx_sw); > > prv = sched->prv; >- UK_TAILQ_INIT(&prv->exited_threads); > UK_TAILQ_INIT(&prv->thread_list); > prv->threads_started = 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 |