sched.go 1.4 KB
Newer Older
M
MarsChan 已提交
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
/*
 * Copyright (c) 2020 Huawei Technologies Co., Ltd.
 * wisdom-advisor is licensed under the Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *     http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
 * PURPOSE.
 * See the Mulan PSL v2 for more details.
 * Create: 2020-6-9
 */

// Package sched implements utility to set schedule properties of tasks
package sched

import (
	"fmt"
	"math/bits"
	"syscall"
	"unsafe"
)

const (
	cpuSetSize = 1024
	cpuBits    = bits.UintSize
	cpuBytes   = cpuBits / 8
)

type cpuSet [cpuSetSize / cpuBits]uintptr

// SetAffinity is handler to set thread cpu affinity.
var SetAffinity func(tid uint64, cpu []int) error

func init() {
	SetAffinity = setAffinity
}

func setAffinity(tid uint64, cpu []int) error {
	var mask cpuSet
	for _, cpuID := range cpu {
		mask[cpuID/cpuBits] |= 1 << (cpuID % cpuBits)
	}
	if _, _, errno := syscall.RawSyscall(syscall.SYS_SCHED_SETAFFINITY,
		uintptr(tid), uintptr(len(mask)*cpuBytes), uintptr(unsafe.Pointer(&mask[0]))); errno != 0 {
		return fmt.Errorf("tid:%d setaffinity fails:%s", tid, syscall.Errno(errno))
	}
	return nil
}