1/**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors:   Sean Kelly,
7              Alex R��nne Petersen
8 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
9 */
10
11/*          Copyright Sean Kelly 2005 - 2009.
12 * Distributed under the Boost Software License, Version 1.0.
13 *    (See accompanying file LICENSE or copy at
14 *          http://www.boost.org/LICENSE_1_0.txt)
15 */
16module core.sys.posix.sched;
17
18import core.sys.posix.config;
19public import core.sys.posix.time;
20public import core.sys.posix.sys.types;
21
22version (OSX)
23    version = Darwin;
24else version (iOS)
25    version = Darwin;
26else version (TVOS)
27    version = Darwin;
28else version (WatchOS)
29    version = Darwin;
30
31version (Posix):
32extern (C):
33nothrow:
34@nogc:
35@system:
36
37//
38// Required
39//
40/*
41struct sched_param
42{
43    int sched_priority (THR)
44    int sched_ss_low_priority (SS|TSP)
45    struct timespec sched_ss_repl_period (SS|TSP)
46    struct timespec sched_ss_init_budget (SS|TSP)
47    int sched_ss_max_repl (SS|TSP)
48}
49
50SCHED_FIFO
51SCHED_RR
52SCHED_SPORADIC (SS|TSP)
53SCHED_OTHER
54
55int sched_getparam(pid_t, sched_param*);
56int sched_getscheduler(pid_t);
57int sched_setparam(pid_t, const scope sched_param*);
58int sched_setscheduler(pid_t, int, const scope sched_param*);
59*/
60
61version (linux)
62{
63    version (CRuntime_Musl)
64    {
65        struct sched_param
66        {
67            int sched_priority;
68            int __reserved1;
69            timespec[2] __reserved2;
70            int __reserved3;
71        }
72    }
73    else
74    {
75        struct sched_param
76        {
77            int sched_priority;
78        }
79    }
80
81    enum SCHED_OTHER    = 0;
82    enum SCHED_FIFO     = 1;
83    enum SCHED_RR       = 2;
84    //SCHED_SPORADIC (SS|TSP)
85    enum SCHED_BATCH    = 3;
86    enum SCHED_IDLE     = 5;
87    enum SCHED_RESET_ON_FORK = 0x40000000;
88}
89else version (Darwin)
90{
91    enum SCHED_OTHER    = 1;
92    enum SCHED_FIFO     = 4;
93    enum SCHED_RR       = 2;
94    //SCHED_SPORADIC (SS|TSP)
95
96    struct sched_param
97    {
98        int                             sched_priority;
99        byte[__PTHREAD_MUTEX_SIZE__]    __opaque;
100    }
101}
102else version (FreeBSD)
103{
104    struct sched_param
105    {
106        int sched_priority;
107    }
108
109    enum SCHED_FIFO     = 1;
110    enum SCHED_OTHER    = 2;
111    enum SCHED_RR       = 3;
112}
113else version (NetBSD)
114{
115    struct sched_param
116    {
117        int sched_priority;
118    }
119
120    enum SCHED_FIFO     = 1;
121    enum SCHED_OTHER    = 0;
122    enum SCHED_RR       = 2;
123}
124else version (OpenBSD)
125{
126    struct sched_param
127    {
128        int sched_priority;
129    }
130
131    enum SCHED_FIFO     = 1;
132    enum SCHED_OTHER    = 2;
133    enum SCHED_RR       = 3;
134}
135else version (DragonFlyBSD)
136{
137    struct sched_param
138    {
139        int sched_priority;
140    }
141
142    enum SCHED_FIFO     = 1;
143    enum SCHED_OTHER    = 2;
144    enum SCHED_RR       = 3;
145}
146else version (Solaris)
147{
148    struct sched_param
149    {
150        int sched_priority;
151        int[8] sched_pad;
152    }
153
154    enum SCHED_OTHER = 0;
155    enum SCHED_FIFO = 1;
156    enum SCHED_RR = 2;
157    enum SCHED_SYS = 3;
158    enum SCHED_IA = 4;
159    enum SCHED_FSS = 5;
160    enum SCHED_FX = 6;
161    enum _SCHED_NEXT = 7;
162}
163else
164{
165    static assert(false, "Unsupported platform");
166}
167
168int sched_getparam(pid_t, sched_param*);
169int sched_getscheduler(pid_t);
170int sched_setparam(pid_t, const scope sched_param*);
171int sched_setscheduler(pid_t, int, const scope sched_param*);
172
173//
174// Thread (THR)
175//
176/*
177int sched_yield();
178*/
179
180version (CRuntime_Glibc)
181{
182    int sched_yield();
183}
184else version (Darwin)
185{
186    int sched_yield();
187}
188else version (FreeBSD)
189{
190    int sched_yield();
191}
192else version (NetBSD)
193{
194    int sched_yield();
195}
196else version (OpenBSD)
197{
198    int sched_yield();
199}
200else version (DragonFlyBSD)
201{
202    int sched_yield();
203}
204else version (Solaris)
205{
206    int sched_yield();
207}
208else version (CRuntime_Bionic)
209{
210    int sched_yield();
211}
212else version (CRuntime_Musl)
213{
214    int sched_yield();
215}
216else version (CRuntime_UClibc)
217{
218    int sched_yield();
219}
220else
221{
222    static assert(false, "Unsupported platform");
223}
224
225//
226// Scheduling (TPS)
227//
228/*
229int sched_get_priority_max(int);
230int sched_get_priority_min(int);
231int sched_rr_get_interval(pid_t, timespec*);
232*/
233
234version (CRuntime_Glibc)
235{
236    int sched_get_priority_max(int);
237    int sched_get_priority_min(int);
238    int sched_rr_get_interval(pid_t, timespec*);
239}
240else version (Darwin)
241{
242    int sched_get_priority_min(int);
243    int sched_get_priority_max(int);
244    //int sched_rr_get_interval(pid_t, timespec*); // FIXME: unavailable?
245}
246else version (FreeBSD)
247{
248    int sched_get_priority_min(int);
249    int sched_get_priority_max(int);
250    int sched_rr_get_interval(pid_t, timespec*);
251}
252else version (NetBSD)
253{
254    int sched_get_priority_min(int);
255    int sched_get_priority_max(int);
256    int sched_rr_get_interval(pid_t, timespec*);
257}
258else version (OpenBSD)
259{
260    int sched_get_priority_min(int);
261    int sched_get_priority_max(int);
262    int sched_rr_get_interval(pid_t, timespec*);
263}
264else version (DragonFlyBSD)
265{
266    int sched_get_priority_min(int);
267    int sched_get_priority_max(int);
268    int sched_rr_get_interval(pid_t, timespec*);
269}
270else version (Solaris)
271{
272    int sched_get_priority_max(int);
273    int sched_get_priority_min(int);
274    int sched_rr_get_interval(pid_t, timespec*);
275}
276else version (CRuntime_Bionic)
277{
278    int sched_get_priority_max(int);
279    int sched_get_priority_min(int);
280    int sched_rr_get_interval(pid_t, timespec*);
281}
282else version (CRuntime_Musl)
283{
284    int sched_get_priority_max(int);
285    int sched_get_priority_min(int);
286    int sched_rr_get_interval(pid_t, timespec*);
287}
288else version (CRuntime_UClibc)
289{
290    int sched_get_priority_max(int);
291    int sched_get_priority_min(int);
292    int sched_rr_get_interval(pid_t, timespec*);
293}
294else
295{
296    static assert(false, "Unsupported platform");
297}
298