File: rt_sched.lua

package info (click to toggle)
lua-posix 36.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,720 kB
  • sloc: ansic: 5,462; makefile: 21; sh: 6
file content (142 lines) | stat: -rw-r--r-- 3,688 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#! /usr/bin/env lua

--[[
 This example tests sched_setscheduler() / sched_getscheduler()
 The script must be run as privileged process (CAP_SYS_NICE on linux)
]]

local M = require 'posix.sched'


local mypid = require 'posix.unistd'.getpid()

-- get sched params from ps(1)
local function get_ps_sched(pid)
   local fp = io.popen(string.format('ps --no-headers -o "policy,rtprio" %s', pid))
   local res, err = fp:read'*a'
   assert(res, err)
   fp:close()
   local policy, rtprio = string.match(res, '([^%s]+)%s+([^%s]+)')
   assert(policy)
   assert(rtprio)
   return policy, rtprio
end


do -- Tests on own process

   -- get scheduler policy for own process
   local res, err = M.sched_getscheduler(0) -- 0 pid: own process
   assert(res == M.SCHED_OTHER)
   local res, err = M.sched_getscheduler() -- default pid: own process
   assert(res == M.SCHED_OTHER)

   local policy, rtprio = get_ps_sched(mypid)
   assert(policy== 'TS')
   assert(rtprio== '-')


   -- set realtime priority on own process : SCHED_FIFO
   local res, err = M.sched_setscheduler(0, p.SCHED_FIFO, 10 )
   assert(res, err)

   local policy, rtprio = get_ps_sched(mypid)
   assert(policy == 'FF')
   assert(rtprio == '10')

   local res, err = M.sched_getscheduler(0)
   assert(res == M.SCHED_FIFO)


   -- set realtime priority on own process SCHED_RR
   local res, err = M.sched_setscheduler(0, M.SCHED_RR, 11 )
   assert(res, err)

   local policy, rtprio = get_ps_sched(mypid)
   assert(policy == 'RR')
   assert(rtprio == '11')

   local res, err = M.sched_getscheduler(0)
   assert(res == M.SCHED_RR)


   -- no parameters: reset own process to normal priority :
   local res, err = M.sched_setscheduler()
   assert(res, err)

   local policy, rtprio = get_ps_sched(mypid)
   assert(policy == 'TS')
   assert(rtprio == '-')

   local res, err = M.sched_getscheduler(0)
   assert(res == M.SCHED_OTHER)
end


-- fork a child to check sched_setscheduler on other process
do
   local U = require 'posix.unistd'

   local r, w = U.pipe()
   local childpid = U.fork()
   if childpid == 0 then
      -- child: block on pipe until parent is finshed
      U.close(w)  -- close unused write end
      local b = U.read(r,1)
      U._exit(0)
   end

   -- parent:
   U.close(r)

   do -- do tests
      -- get scheduler policy for child process
      local res, err = M.sched_getscheduler(childpid)
      assert(res == M.SCHED_OTHER)

      local policy, rtprio = get_ps_sched(childpid)
      assert(policy == 'TS')
      assert(rtprio == '-')


      -- set realtime priority on child process : SCHED_FIFO
      local res, err = M.sched_setscheduler(childpid, M.SCHED_FIFO, 10 )
      assert(res, err)

      local policy, rtprio = get_ps_sched(childpid)
      assert(policy == 'FF')
      assert(rtprio == '10')

      local res, err = M.sched_getscheduler(childpid)
      assert(res == M.SCHED_FIFO)


      -- set realtime priority on child process SCHED_RR
      local res, err = M.sched_setscheduler(childpid, M.SCHED_RR, 11 )
      assert(res, err)

      local policy, rtprio = get_ps_sched(childpid)
      assert(policy == 'RR')
      assert(rtprio == '11')

      local res, err = M.sched_getscheduler(childpid)
      assert(res == M.SCHED_RR)


      -- no parameters after pid: reset child process to normal priority :
      local res, err = M.sched_setscheduler(childpid)
      assert(res, err)

      local policy, rtprio = get_ps_sched(childpid)
      assert(policy == 'TS')
      assert(rtprio == '-')

      local res, err = M.sched_getscheduler(childpid)
      assert(res == M.SCHED_OTHER)
   end

   -- stop child
   U.write(w, 'stop')
   U.close(w)
   require 'posix.sys.wait'.wait(childpid)
end