sched.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Process.h>
  7. namespace Kernel {
  8. KResultOr<FlatPtr> Process::sys$yield()
  9. {
  10. REQUIRE_PROMISE(stdio);
  11. Thread::current()->yield_without_holding_big_lock();
  12. return 0;
  13. }
  14. KResultOr<FlatPtr> Process::sys$donate(pid_t tid)
  15. {
  16. REQUIRE_PROMISE(stdio);
  17. if (tid < 0)
  18. return EINVAL;
  19. ScopedCritical critical;
  20. auto thread = Thread::from_tid(tid);
  21. if (!thread || thread->pid() != pid())
  22. return ESRCH;
  23. Thread::current()->donate_without_holding_big_lock(thread, "sys$donate");
  24. return 0;
  25. }
  26. KResultOr<FlatPtr> Process::sys$sched_setparam(int pid, Userspace<const struct sched_param*> user_param)
  27. {
  28. REQUIRE_PROMISE(proc);
  29. struct sched_param desired_param;
  30. if (!copy_from_user(&desired_param, user_param))
  31. return EFAULT;
  32. if (desired_param.sched_priority < THREAD_PRIORITY_MIN || desired_param.sched_priority > THREAD_PRIORITY_MAX)
  33. return EINVAL;
  34. auto* peer = Thread::current();
  35. ScopedSpinLock lock(g_scheduler_lock);
  36. if (pid != 0)
  37. peer = Thread::from_tid(pid);
  38. if (!peer)
  39. return ESRCH;
  40. if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
  41. return EPERM;
  42. peer->set_priority((u32)desired_param.sched_priority);
  43. return 0;
  44. }
  45. KResultOr<FlatPtr> Process::sys$sched_getparam(pid_t pid, Userspace<struct sched_param*> user_param)
  46. {
  47. REQUIRE_PROMISE(proc);
  48. int priority;
  49. {
  50. auto* peer = Thread::current();
  51. ScopedSpinLock lock(g_scheduler_lock);
  52. if (pid != 0) {
  53. // FIXME: PID/TID BUG
  54. // The entire process is supposed to be affected.
  55. peer = Thread::from_tid(pid);
  56. }
  57. if (!peer)
  58. return ESRCH;
  59. if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
  60. return EPERM;
  61. priority = (int)peer->priority();
  62. }
  63. struct sched_param param {
  64. priority
  65. };
  66. if (!copy_to_user(user_param, &param))
  67. return EFAULT;
  68. return 0;
  69. }
  70. }