diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-03-11 20:03:08 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-03-11 20:03:08 +0900 |
| commit | fd515badffc159b62c5140b8340164ccd29e41f5 (patch) | |
| tree | e4bfb24189960c360bd72e964d3f0acb3b28c4b7 /container/syscall.go | |
| parent | 330a344845aa8653772a9be6c085f4fdb602a028 (diff) | |
container: move scheduler policy constants to std
This avoids depending on cgo.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/syscall.go')
| -rw-r--r-- | container/syscall.go | 131 |
1 files changed, 1 insertions, 130 deletions
diff --git a/container/syscall.go b/container/syscall.go index 1b85b91a..cba9b7cc 100644 --- a/container/syscall.go +++ b/container/syscall.go @@ -1,9 +1,6 @@ package container import ( - "encoding" - "strconv" - "sync" . "syscall" "unsafe" @@ -46,132 +43,6 @@ func Isatty(fd int) bool { return r == 0 } -// SchedPolicy denotes a scheduling policy defined in include/uapi/linux/sched.h. -type SchedPolicy int - -// include/uapi/linux/sched.h -const ( - SCHED_NORMAL SchedPolicy = iota - SCHED_FIFO - SCHED_RR - SCHED_BATCH - _SCHED_ISO // SCHED_ISO: reserved but not implemented yet - SCHED_IDLE - SCHED_DEADLINE - SCHED_EXT - - _SCHED_LAST SchedPolicy = iota - 1 -) - -var _ encoding.TextMarshaler = _SCHED_LAST -var _ encoding.TextUnmarshaler = new(_SCHED_LAST) - -// String returns a unique representation of policy, also used in encoding. -func (policy SchedPolicy) String() string { - switch policy { - case SCHED_NORMAL: - return "" - case SCHED_FIFO: - return "fifo" - case SCHED_RR: - return "rr" - case SCHED_BATCH: - return "batch" - case SCHED_IDLE: - return "idle" - case SCHED_DEADLINE: - return "deadline" - case SCHED_EXT: - return "ext" - - default: - return "invalid policy " + strconv.Itoa(int(policy)) - } -} - -// MarshalText performs bounds checking and returns the result of String. -func (policy SchedPolicy) MarshalText() ([]byte, error) { - if policy == _SCHED_ISO || policy < 0 || policy > _SCHED_LAST { - return nil, EINVAL - } - return []byte(policy.String()), nil -} - -// InvalidSchedPolicyError is an invalid string representation of a [SchedPolicy]. -type InvalidSchedPolicyError string - -func (InvalidSchedPolicyError) Unwrap() error { return EINVAL } -func (e InvalidSchedPolicyError) Error() string { - return "invalid scheduling policy " + strconv.Quote(string(e)) -} - -// UnmarshalText is the inverse of MarshalText. -func (policy *SchedPolicy) UnmarshalText(text []byte) error { - switch string(text) { - case "fifo": - *policy = SCHED_FIFO - case "rr": - *policy = SCHED_RR - case "batch": - *policy = SCHED_BATCH - case "idle": - *policy = SCHED_IDLE - case "deadline": - *policy = SCHED_DEADLINE - case "ext": - *policy = SCHED_EXT - - case "": - *policy = 0 - return nil - default: - return InvalidSchedPolicyError(text) - } - return nil -} - -// for sched_get_priority_max and sched_get_priority_min -var ( - schedPriority [_SCHED_LAST + 1][2]std.Int - schedPriorityErr [_SCHED_LAST + 1][2]error - schedPriorityOnce [_SCHED_LAST + 1][2]sync.Once -) - -// GetPriorityMax returns the maximum priority value that can be used with the -// scheduling algorithm identified by policy. -func (policy SchedPolicy) GetPriorityMax() (std.Int, error) { - schedPriorityOnce[policy][0].Do(func() { - priority, _, errno := Syscall( - SYS_SCHED_GET_PRIORITY_MAX, - uintptr(policy), - 0, 0, - ) - schedPriority[policy][0] = std.Int(priority) - if schedPriority[policy][0] < 0 { - schedPriorityErr[policy][0] = errno - } - }) - return schedPriority[policy][0], schedPriorityErr[policy][0] -} - -// GetPriorityMin returns the minimum priority value that can be used with the -// scheduling algorithm identified by policy. -func (policy SchedPolicy) GetPriorityMin() (std.Int, error) { - schedPriorityOnce[policy][1].Do(func() { - priority, _, errno := Syscall( - SYS_SCHED_GET_PRIORITY_MIN, - uintptr(policy), - 0, 0, - ) - schedPriority[policy][1] = std.Int(priority) - if schedPriority[policy][1] < 0 { - schedPriorityErr[policy][1] = errno - } - }) - return schedPriority[policy][1], schedPriorityErr[policy][1] - -} - // schedParam is equivalent to struct sched_param from include/linux/sched.h. type schedParam struct { // sched_priority @@ -191,7 +62,7 @@ type schedParam struct { // this if you do not have something similar in place! // // [very subtle to use correctly]: https://www.openwall.com/lists/musl/2016/03/01/4 -func schedSetscheduler(tid int, policy SchedPolicy, param *schedParam) error { +func schedSetscheduler(tid int, policy std.SchedPolicy, param *schedParam) error { if r, _, errno := Syscall( SYS_SCHED_SETSCHEDULER, uintptr(tid), |
