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
|
/*******************************************************************************
D binding for Linux specific scheduler control methods.
Defines functions sched_setaffinity and sched_getaffinity and the data
types they operate on.
Copyright: Copyright (c) 2016 Sociomantic Labs. All rights reserved.
License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
Authors: Nemanja Boric
*******************************************************************************/
module core.sys.linux.sched;
import core.bitop : popcnt;
import core.sys.posix.sched;
import core.sys.posix.config;
import core.sys.posix.sys.types;
version (linux):
extern (C):
@nogc:
nothrow:
private // helpers
{
/* Size definition for CPU sets. */
enum
{
__CPU_SETSIZE = 1024,
__NCPUBITS = 8 * cpu_mask.sizeof,
}
/* Macros */
/* Basic access functions. */
size_t __CPUELT(size_t cpu) pure
{
return cpu / __NCPUBITS;
}
cpu_mask __CPUMASK(size_t cpu) pure
{
return 1UL << (cpu % __NCPUBITS);
}
cpu_mask __CPU_SET_S(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
{
if (cpu < 8 * setsize)
{
cpusetp.__bits[__CPUELT(cpu)] |= __CPUMASK(cpu);
return __CPUMASK(cpu);
}
return 0;
}
bool __CPU_ISSET_S(size_t cpu, size_t setsize, cpu_set_t* cpusetp) pure
{
if (cpu < 8 * setsize)
return (cpusetp.__bits[__CPUELT(cpu)] & __CPUMASK(cpu)) != 0;
return false;
}
int __CPU_COUNT_S(size_t setsize, cpu_set_t* cpusetp) pure
{
int s = 0;
foreach (i; cpusetp.__bits[0 .. (setsize / cpu_mask.sizeof)])
s += popcnt(i);
return s;
}
}
/// Type for array elements in 'cpu_set_t'.
alias c_ulong cpu_mask;
/// Data structure to describe CPU mask.
struct cpu_set_t
{
cpu_mask[__CPU_SETSIZE / __NCPUBITS] __bits;
}
/// Access macros for 'cpu_set' (missing a lot of them)
cpu_mask CPU_SET(size_t cpu, cpu_set_t* cpusetp) pure
{
return __CPU_SET_S(cpu, cpu_set_t.sizeof, cpusetp);
}
bool CPU_ISSET(size_t cpu, cpu_set_t* cpusetp) pure
{
return __CPU_ISSET_S(cpu, cpu_set_t.sizeof, cpusetp);
}
int CPU_COUNT(cpu_set_t* cpusetp) pure
{
return __CPU_COUNT_S(cpu_set_t.sizeof, cpusetp);
}
/* Functions */
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
|