Просмотр исходного кода

!514 增加进程线程相关的系统调用
Merge pull request !514 from wsljy2021/rt-smart

bernard 3 лет назад
Родитель
Сommit
5c43d62734
1 измененных файлов с 96 добавлено и 1 удалено
  1. 96 1
      components/lwp/lwp_syscall.c

+ 96 - 1
components/lwp/lwp_syscall.c

@@ -56,7 +56,7 @@
 
 #include <tty.h>
 #include "lwp_ipc_internal.h"
-
+#include <pthread.h>
 #ifndef GRND_NONBLOCK
 #define GRND_NONBLOCK	0x0001
 #endif /* GRND_NONBLOCK */
@@ -4026,6 +4026,95 @@ int sys_setaffinity(pid_t pid, int cpu)
     return lwp_setaffinity(pid, cpu);
 }
 
+int sys_sched_setparam(pid_t pid, void *param)
+{
+    struct sched_param *sched_param = (struct sched_param *)param;
+    struct rt_lwp *lwp = NULL;
+    rt_thread_t main_thread;
+    int ret = -1;
+    if (!lwp_user_accessable(param, sizeof(struct sched_param)))
+    {
+        return -EFAULT;
+    }
+    if (pid > 0)
+    {
+        lwp = lwp_from_pid(pid);
+    }
+    else if (pid == 0)
+    {
+        lwp = lwp_self();
+    }
+    if (lwp)
+    {
+        main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+        return rt_thread_control(main_thread, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&sched_param->sched_priority);
+    }
+    return ret;
+}
+
+int sys_sched_getparam(pid_t pid, void *param)
+{
+    struct sched_param *sched_param = (struct sched_param *)param;
+    struct rt_lwp *lwp = NULL;
+    rt_thread_t main_thread;
+    int ret = -1;
+    if (!lwp_user_accessable(param, sizeof(struct sched_param)))
+    {
+        return -EFAULT;
+    }
+    if (pid > 0)
+    {
+        lwp = lwp_from_pid(pid);
+    }
+    else if (pid == 0)
+    {
+        lwp = lwp_self();
+    }
+    if (lwp)
+    {
+        main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+        sched_param->sched_priority = main_thread->current_priority;
+        ret = 0;
+    }
+    return ret;
+}
+
+int sys_sched_get_priority_max(int policy)
+{
+    return RT_THREAD_PRIORITY_MAX;
+}
+
+int sys_sched_get_priority_min(int policy)
+{
+    return 0;
+}
+
+int sys_sched_setscheduler(int tid, int policy, void *param)
+{
+    struct sched_param *sched_param = (struct sched_param *)param;
+    rt_thread_t thread = lwp_tid_get_thread(tid);
+
+    if (!lwp_user_accessable(param, sizeof(struct sched_param)))
+    {
+        return -EFAULT;
+    }
+    return rt_thread_control(thread, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&sched_param->sched_priority);
+    return 0;
+}
+
+int sys_sched_getscheduler(int tid, int *policy, void *param)
+{
+    struct sched_param *sched_param = (struct sched_param *)param;
+    rt_thread_t thread = lwp_tid_get_thread(tid);
+    if (!lwp_user_accessable(sched_param, sizeof(struct sched_param)))
+    {
+        return -EFAULT;
+    }
+    sched_param->sched_priority = thread->current_priority;
+    *policy = 0;
+    return 0;
+}
+
 const static void* func_table[] =
 {
     (void *)sys_exit,            /* 01 */
@@ -4214,6 +4303,12 @@ const static void* func_table[] =
     (void *)sys_notimpl,    // (void *)sys_readlink     /* 145 */
     SYSCALL_USPACE(sys_mremap),
     SYSCALL_USPACE(sys_madvise),
+    (void *)sys_sched_setparam,
+    (void *)sys_sched_getparam,
+    (void *)sys_sched_get_priority_max,
+    (void *)sys_sched_get_priority_min,
+    (void *)sys_sched_setscheduler,
+    (void *)sys_sched_getscheduler,
 };
 
 const void *lwp_get_sys_api(rt_uint32_t number)