[RFC PATCH gnumach 3/3] tests-task: add test for task/thread priority RPCs

[email protected]
Newsgroups gmane.os.hurd.bugs
Message-ID <168ffb1128961b0592a895b7996acc02f61bf6bc.1777244313.git.dnietoc@gmail.com>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.