aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/syscall.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-03-11 20:03:08 +0900
committerOphestra <cat@gensokyo.uk>2026-03-11 20:03:08 +0900
commitfd515badffc159b62c5140b8340164ccd29e41f5 (patch)
treee4bfb24189960c360bd72e964d3f0acb3b28c4b7 /container/syscall.go
parent330a344845aa8653772a9be6c085f4fdb602a028 (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.go131
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),