Thanks for thinking about writing tests! :)
[email protected], le lun. 27 avril 2026 00:07:13 +0100, a ecrit: > From: Diego Nieto Cid <[email protected]> > > --- > tests/test-task.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 106 insertions(+) > > diff --git a/tests/test-task.c b/tests/test-task.c > index cbc75e23..4be9c193 100644 > --- a/tests/test-task.c > +++ b/tests/test-task.c > @@ -27,6 +27,7 @@ > > #include <gnumach.user.h> > #include <mach.user.h> > +#include <mach_host.user.h> > > > void test_task() > @@ -160,6 +161,110 @@ int test_errors() > ASSERT(err == MACH_SEND_INVALID_DEST, "task DEAD"); > } > > +void test_priority() > +{ > +/* XXX cannot include <kern/sched.h> */ > +#define BASEPRI_USER 25 > + kern_return_t err; > + struct task_basic_info tk_binfo; > + struct thread_sched_info th_sinfo; > + int count; > + thread_t new_th; > + > + /* Get current task priority */ > + count = TASK_BASIC_INFO_COUNT; > + err = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&tk_binfo, > &count); > + ASSERT_RET(err, "TASK_BASIC_INFO failed!"); > + printf("initial base priority is %d\n", tk_binfo.base_priority); > + ASSERT(tk_binfo.base_priority == BASEPRI_USER, "(task) Unexpected initial > base priority"); > + > + err = task_priority(mach_task_self(), 5, 0); > + ASSERT_RET(err, "task_priority (5, 0) failed"); > + > + err = task_priority(mach_task_self(), 5, 1); > + ASSERT(err != KERN_SUCCESS, "task_priority (5, 1) succeeded!"); > + > + /* Get current task priority */ > + count = TASK_BASIC_INFO_COUNT; > + err = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&tk_binfo, > &count); > + ASSERT_RET(err, "TASK_BASIC_INFO failed!"); > + ASSERT(tk_binfo.base_priority == 5, > + "(task) previous call to task_priority didn't set base priority"); > + > + /* Restore base priority */ > + err = task_priority(mach_task_self(), BASEPRI_USER, 0); > + ASSERT_RET(err, "task_priority (BASEPRI_USER, 0) failed"); > + > + /* Get current thread priority */ > + count = THREAD_SCHED_INFO_COUNT; > + err = thread_info(mach_thread_self(), THREAD_SCHED_INFO, > (thread_info_t)&th_sinfo, &count); > + ASSERT_RET(err, "THREAD_SCHED_INFO failed!"); > + ASSERT(th_sinfo.base_priority == BASEPRI_USER, "(thread) Unexpected > initial base priority"); > + ASSERT(th_sinfo.max_priority == BASEPRI_USER, "(thread) Unexpected initial > max priority"); > + > + err = task_priority_override(mach_host_self(), mach_task_self(), 5); > + ASSERT(err == KERN_INVALID_ARGUMENT, > + "task_priority_override must require the host privileged port"); > + > + err = task_priority_override(host_priv(), mach_task_self(), 5); > + ASSERT_RET(err, "task_priority_override (5) failed"); > + > + /* Get updated task priority */ > + count = TASK_BASIC_INFO_COUNT; > + err = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&tk_binfo, > &count); > + ASSERT_RET(err, "TASK_BASIC_INFO failed!"); > + ASSERT(tk_binfo.base_priority == 5, "Priority not updated"); > + > + /* Get updated thread priority */ > + count = THREAD_SCHED_INFO_COUNT; > + err = thread_info(mach_thread_self(), THREAD_SCHED_INFO, > (thread_info_t)&th_sinfo, &count); > + ASSERT_RET(err, "THREAD_SCHED_INFO failed!"); > + printf("(thread) updated base priority is %d\n", th_sinfo.base_priority); > + ASSERT(th_sinfo.base_priority == 5, "(thread) Unexpected updated base > priority"); > + ASSERT(th_sinfo.max_priority == 5, "(thread) Unexpected updated max > priority"); > + > + err = thread_create(mach_task_self(), &new_th); > + ASSERT_RET(err, "thread_create failed"); > + > + /* Get new thread priority */ > + count = THREAD_SCHED_INFO_COUNT; > + err = thread_info(new_th, THREAD_SCHED_INFO, (thread_info_t)&th_sinfo, > &count); > + ASSERT_RET(err, "THREAD_SCHED_INFO failed!"); > + printf("(new thread) initial base priority is %d\n", > th_sinfo.base_priority); > + ASSERT(th_sinfo.base_priority == 5, "(new thread) Unexpected initial base > priority"); > + ASSERT(th_sinfo.max_priority == 5, "(new thread) Unexpected initial max > priority"); > + > + /* Restore priorities */ > + err = task_priority_override(host_priv(), mach_task_self(), BASEPRI_USER); > + ASSERT_RET(err, "task_priority_override (BASEPRI_USER) failed"); > + > + /* Check new thread priority was updated */ > + count = THREAD_SCHED_INFO_COUNT; > + err = thread_info(new_th, THREAD_SCHED_INFO, (thread_info_t)&th_sinfo, > &count); > + ASSERT_RET(err, "THREAD_SCHED_INFO failed!"); > + printf("(new thread) updated base priority is %d\n", > th_sinfo.base_priority); > + ASSERT(th_sinfo.base_priority == BASEPRI_USER, "(new thread) Unexpected > updated base priority"); > + /* > + * Here we still expect the updated max priority. The new priority set > above > + * is bigger than the previous one therefore the max_priority of the thread > + * is not adjusted. > + */ > + ASSERT(th_sinfo.max_priority == 5, "(new thread) Unexpected updated max > priority"); > + > + err = thread_priority(new_th, BASEPRI_USER, TRUE); > + ASSERT_RET(err, "thread_priority failed!"); > + > + /* Check new thread's max priority was updated */ > + count = THREAD_SCHED_INFO_COUNT; > + err = thread_info(new_th, THREAD_SCHED_INFO, (thread_info_t)&th_sinfo, > &count); > + ASSERT_RET(err, "THREAD_SCHED_INFO failed!"); > + printf("(new thread) updated max priority is %d\n", th_sinfo.max_priority); > + ASSERT(th_sinfo.max_priority == BASEPRI_USER, "(new thread) Unexpected > updated base priority"); > + > + err = thread_terminate(new_th); > + ASSERT_RET(err, "thread_terminate failed"); > +#undef BASEPRI_USER > +} > > int main(int argc, char *argv[], int envc, char *envp[]) > { > @@ -167,5 +272,6 @@ int main(int argc, char *argv[], int envc, char *envp[]) > test_task_threads(); > test_new_task(); > test_errors(); > + test_priority(); > return 0; > } > -- > 2.53.0 > > -- Samuel R: Parce que ça renverse bêtement l'ordre naturel de lecture! Q: Mais pourquoi citer en fin d'article est-il si effroyable? R: Citer en fin d'article Q: Quelle est la chose la plus désagréable sur les groupes de news?
