xref: /aosp_15_r20/bionic/tests/sched_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <sched.h>
21*8d67ca89SAndroid Build Coastguard Worker #include <sys/types.h>
22*8d67ca89SAndroid Build Coastguard Worker #include <sys/wait.h>
23*8d67ca89SAndroid Build Coastguard Worker 
24*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
25*8d67ca89SAndroid Build Coastguard Worker 
child_fn(void * i_ptr)26*8d67ca89SAndroid Build Coastguard Worker static int child_fn(void* i_ptr) {
27*8d67ca89SAndroid Build Coastguard Worker   *reinterpret_cast<int*>(i_ptr) = 42;
28*8d67ca89SAndroid Build Coastguard Worker   return 123;
29*8d67ca89SAndroid Build Coastguard Worker }
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
TEST(sched,clone)32*8d67ca89SAndroid Build Coastguard Worker TEST(sched, clone) {
33*8d67ca89SAndroid Build Coastguard Worker   void* child_stack[1024];
34*8d67ca89SAndroid Build Coastguard Worker 
35*8d67ca89SAndroid Build Coastguard Worker   int i = 0;
36*8d67ca89SAndroid Build Coastguard Worker   pid_t tid = clone(child_fn, &child_stack[1024], CLONE_VM, &i);
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker   int status;
39*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(tid, TEMP_FAILURE_RETRY(waitpid(tid, &status, __WCLONE)));
40*8d67ca89SAndroid Build Coastguard Worker 
41*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(42, i);
42*8d67ca89SAndroid Build Coastguard Worker 
43*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(WIFEXITED(status));
44*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(123, WEXITSTATUS(status));
45*8d67ca89SAndroid Build Coastguard Worker }
46*8d67ca89SAndroid Build Coastguard Worker #else
47*8d67ca89SAndroid Build Coastguard Worker // For glibc, any call to clone with CLONE_VM set will cause later pthread
48*8d67ca89SAndroid Build Coastguard Worker // calls in the same process to misbehave.
49*8d67ca89SAndroid Build Coastguard Worker // See https://sourceware.org/bugzilla/show_bug.cgi?id=10311 for more details.
TEST(sched,clone)50*8d67ca89SAndroid Build Coastguard Worker TEST(sched, clone) {
51*8d67ca89SAndroid Build Coastguard Worker   // In order to enumerate all possible tests for CTS, create an empty test.
52*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "glibc is broken";
53*8d67ca89SAndroid Build Coastguard Worker }
54*8d67ca89SAndroid Build Coastguard Worker #endif
55*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,clone_errno)56*8d67ca89SAndroid Build Coastguard Worker TEST(sched, clone_errno) {
57*8d67ca89SAndroid Build Coastguard Worker   // Check that our hand-written clone assembler sets errno correctly on failure.
58*8d67ca89SAndroid Build Coastguard Worker   uintptr_t fake_child_stack[16];
59*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
60*8d67ca89SAndroid Build Coastguard Worker   // If CLONE_THREAD is set, CLONE_SIGHAND must be set too.
61*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, clone(child_fn, &fake_child_stack[16], CLONE_THREAD, nullptr));
62*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
63*8d67ca89SAndroid Build Coastguard Worker }
64*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,clone_null_child_stack)65*8d67ca89SAndroid Build Coastguard Worker TEST(sched, clone_null_child_stack) {
66*8d67ca89SAndroid Build Coastguard Worker   int i = 0;
67*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
68*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, clone(child_fn, nullptr, CLONE_VM, &i));
69*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
70*8d67ca89SAndroid Build Coastguard Worker }
71*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_set)72*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_set) {
73*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
74*8d67ca89SAndroid Build Coastguard Worker 
75*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
76*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(0, &set);
77*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(17, &set);
78*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
79*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0 || i == 17, CPU_ISSET(i, &set));
80*8d67ca89SAndroid Build Coastguard Worker   }
81*8d67ca89SAndroid Build Coastguard Worker 
82*8d67ca89SAndroid Build Coastguard Worker   // We should fail silently if we try to set/test outside the range.
83*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(CPU_SETSIZE, &set);
84*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CPU_ISSET(CPU_SETSIZE, &set));
85*8d67ca89SAndroid Build Coastguard Worker }
86*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_count)87*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_count) {
88*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
89*8d67ca89SAndroid Build Coastguard Worker 
90*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
91*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, CPU_COUNT(&set));
92*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(2, &set);
93*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(10, &set);
94*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(2, CPU_COUNT(&set));
95*8d67ca89SAndroid Build Coastguard Worker   CPU_CLR(10, &set);
96*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1, CPU_COUNT(&set));
97*8d67ca89SAndroid Build Coastguard Worker }
98*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_zero)99*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_zero) {
100*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
101*8d67ca89SAndroid Build Coastguard Worker 
102*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
103*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, CPU_COUNT(&set));
104*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
105*8d67ca89SAndroid Build Coastguard Worker     ASSERT_FALSE(CPU_ISSET(i, &set));
106*8d67ca89SAndroid Build Coastguard Worker   }
107*8d67ca89SAndroid Build Coastguard Worker }
108*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_clr)109*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_clr) {
110*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
111*8d67ca89SAndroid Build Coastguard Worker 
112*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
113*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(0, &set);
114*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(1, &set);
115*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
116*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET(i, &set));
117*8d67ca89SAndroid Build Coastguard Worker   }
118*8d67ca89SAndroid Build Coastguard Worker   CPU_CLR(1, &set);
119*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
120*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0, CPU_ISSET(i, &set));
121*8d67ca89SAndroid Build Coastguard Worker   }
122*8d67ca89SAndroid Build Coastguard Worker 
123*8d67ca89SAndroid Build Coastguard Worker   // We should fail silently if we try to clear/test outside the range.
124*8d67ca89SAndroid Build Coastguard Worker   CPU_CLR(CPU_SETSIZE, &set);
125*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CPU_ISSET(CPU_SETSIZE, &set));
126*8d67ca89SAndroid Build Coastguard Worker }
127*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_equal)128*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_equal) {
129*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set1;
130*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set2;
131*8d67ca89SAndroid Build Coastguard Worker 
132*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set1);
133*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set2);
134*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(1, &set1);
135*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CPU_EQUAL(&set1, &set2));
136*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(1, &set2);
137*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CPU_EQUAL(&set1, &set2));
138*8d67ca89SAndroid Build Coastguard Worker }
139*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_op)140*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_op) {
141*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set1;
142*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set2;
143*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set3;
144*8d67ca89SAndroid Build Coastguard Worker 
145*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set1);
146*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set2);
147*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set3);
148*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(0, &set1);
149*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(0, &set2);
150*8d67ca89SAndroid Build Coastguard Worker   CPU_SET(1, &set2);
151*8d67ca89SAndroid Build Coastguard Worker 
152*8d67ca89SAndroid Build Coastguard Worker   CPU_AND(&set3, &set1, &set2);
153*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
154*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0, CPU_ISSET(i, &set3));
155*8d67ca89SAndroid Build Coastguard Worker   }
156*8d67ca89SAndroid Build Coastguard Worker 
157*8d67ca89SAndroid Build Coastguard Worker   CPU_XOR(&set3, &set1, &set2);
158*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
159*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 1, CPU_ISSET(i, &set3));
160*8d67ca89SAndroid Build Coastguard Worker   }
161*8d67ca89SAndroid Build Coastguard Worker 
162*8d67ca89SAndroid Build Coastguard Worker   CPU_OR(&set3, &set1, &set2);
163*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < CPU_SETSIZE; i++) {
164*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET(i, &set3));
165*8d67ca89SAndroid Build Coastguard Worker   }
166*8d67ca89SAndroid Build Coastguard Worker }
167*8d67ca89SAndroid Build Coastguard Worker 
168*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_alloc_small)169*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_alloc_small) {
170*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set = CPU_ALLOC(17);
171*8d67ca89SAndroid Build Coastguard Worker   size_t size = CPU_ALLOC_SIZE(17);
172*8d67ca89SAndroid Build Coastguard Worker 
173*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size, set);
174*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, CPU_COUNT_S(size, set));
175*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(16, size, set);
176*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CPU_ISSET_S(16, size, set));
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set);
179*8d67ca89SAndroid Build Coastguard Worker }
180*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_alloc_big)181*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_alloc_big) {
182*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set = CPU_ALLOC(10 * CPU_SETSIZE);
183*8d67ca89SAndroid Build Coastguard Worker   size_t size = CPU_ALLOC_SIZE(10 * CPU_SETSIZE);
184*8d67ca89SAndroid Build Coastguard Worker 
185*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size, set);
186*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, CPU_COUNT_S(size, set));
187*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(CPU_SETSIZE, size, set);
188*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CPU_ISSET_S(CPU_SETSIZE, size, set));
189*8d67ca89SAndroid Build Coastguard Worker 
190*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set);
191*8d67ca89SAndroid Build Coastguard Worker }
192*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_s_macros)193*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_s_macros) {
194*8d67ca89SAndroid Build Coastguard Worker   int set_size = 64;
195*8d67ca89SAndroid Build Coastguard Worker   size_t size = CPU_ALLOC_SIZE(set_size);
196*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set = CPU_ALLOC(set_size);
197*8d67ca89SAndroid Build Coastguard Worker 
198*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size, set);
199*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < set_size; i++) {
200*8d67ca89SAndroid Build Coastguard Worker     ASSERT_FALSE(CPU_ISSET_S(i, size, set));
201*8d67ca89SAndroid Build Coastguard Worker     CPU_SET_S(i, size, set);
202*8d67ca89SAndroid Build Coastguard Worker     ASSERT_TRUE(CPU_ISSET_S(i, size, set));
203*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i + 1, CPU_COUNT_S(size, set));
204*8d67ca89SAndroid Build Coastguard Worker   }
205*8d67ca89SAndroid Build Coastguard Worker 
206*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < set_size; i++) {
207*8d67ca89SAndroid Build Coastguard Worker     CPU_CLR_S(i, size, set);
208*8d67ca89SAndroid Build Coastguard Worker     ASSERT_FALSE(CPU_ISSET_S(i, size, set));
209*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(set_size - i - 1, CPU_COUNT_S(size, set));
210*8d67ca89SAndroid Build Coastguard Worker   }
211*8d67ca89SAndroid Build Coastguard Worker 
212*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set);
213*8d67ca89SAndroid Build Coastguard Worker }
214*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_op_s_macros)215*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_op_s_macros) {
216*8d67ca89SAndroid Build Coastguard Worker   int set_size1 = 64;
217*8d67ca89SAndroid Build Coastguard Worker   int set_size2 = set_size1 * 2;
218*8d67ca89SAndroid Build Coastguard Worker   int set_size3 = set_size1 * 3;
219*8d67ca89SAndroid Build Coastguard Worker   size_t size1 = CPU_ALLOC_SIZE(set_size1);
220*8d67ca89SAndroid Build Coastguard Worker   size_t size2 = CPU_ALLOC_SIZE(set_size2);
221*8d67ca89SAndroid Build Coastguard Worker   size_t size3 = CPU_ALLOC_SIZE(set_size3);
222*8d67ca89SAndroid Build Coastguard Worker 
223*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set1 = CPU_ALLOC(set_size1);
224*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set2 = CPU_ALLOC(set_size2);
225*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set3 = CPU_ALLOC(set_size3);
226*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size1, set1);
227*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size2, set2);
228*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size3, set3);
229*8d67ca89SAndroid Build Coastguard Worker 
230*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(0, size1, set1);
231*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(0, size2, set2);
232*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(1, size3, set2);
233*8d67ca89SAndroid Build Coastguard Worker 
234*8d67ca89SAndroid Build Coastguard Worker   CPU_AND_S(size1, set3, set1, set2);
235*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < set_size3; i++) {
236*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0, CPU_ISSET_S(i, size3, set3));
237*8d67ca89SAndroid Build Coastguard Worker   }
238*8d67ca89SAndroid Build Coastguard Worker 
239*8d67ca89SAndroid Build Coastguard Worker   CPU_OR_S(size1, set3, set1, set2);
240*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < set_size3; i++) {
241*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET_S(i, size3, set3));
242*8d67ca89SAndroid Build Coastguard Worker   }
243*8d67ca89SAndroid Build Coastguard Worker 
244*8d67ca89SAndroid Build Coastguard Worker   CPU_XOR_S(size1, set3, set1, set2);
245*8d67ca89SAndroid Build Coastguard Worker   for (int i = 0; i < set_size3; i++) {
246*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(i == 1, CPU_ISSET_S(i, size3, set3));
247*8d67ca89SAndroid Build Coastguard Worker   }
248*8d67ca89SAndroid Build Coastguard Worker 
249*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set1);
250*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set2);
251*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set3);
252*8d67ca89SAndroid Build Coastguard Worker }
253*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,cpu_equal_s)254*8d67ca89SAndroid Build Coastguard Worker TEST(sched, cpu_equal_s) {
255*8d67ca89SAndroid Build Coastguard Worker   int set_size1 = 64;
256*8d67ca89SAndroid Build Coastguard Worker   int set_size2 = set_size1 * 2;
257*8d67ca89SAndroid Build Coastguard Worker   size_t size1 = CPU_ALLOC_SIZE(set_size1);
258*8d67ca89SAndroid Build Coastguard Worker   size_t size2 = CPU_ALLOC_SIZE(set_size2);
259*8d67ca89SAndroid Build Coastguard Worker 
260*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set1 = CPU_ALLOC(set_size1);
261*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t* set2 = CPU_ALLOC(set_size2);
262*8d67ca89SAndroid Build Coastguard Worker 
263*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size1, set1);
264*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO_S(size2, set2);
265*8d67ca89SAndroid Build Coastguard Worker 
266*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(0, size1, set1);
267*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CPU_EQUAL_S(size1, set1, set1));
268*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CPU_EQUAL_S(size1, set1, set2));
269*8d67ca89SAndroid Build Coastguard Worker   CPU_SET_S(0, size2, set2);
270*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CPU_EQUAL_S(size1, set1, set2));
271*8d67ca89SAndroid Build Coastguard Worker 
272*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set1);
273*8d67ca89SAndroid Build Coastguard Worker   CPU_FREE(set2);
274*8d67ca89SAndroid Build Coastguard Worker }
275*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,sched_get_priority_min_sched_get_priority_max)276*8d67ca89SAndroid Build Coastguard Worker TEST(sched, sched_get_priority_min_sched_get_priority_max) {
277*8d67ca89SAndroid Build Coastguard Worker   EXPECT_LE(sched_get_priority_min(SCHED_BATCH), sched_get_priority_max(SCHED_BATCH));
278*8d67ca89SAndroid Build Coastguard Worker   EXPECT_LE(sched_get_priority_min(SCHED_FIFO), sched_get_priority_max(SCHED_FIFO));
279*8d67ca89SAndroid Build Coastguard Worker   EXPECT_LE(sched_get_priority_min(SCHED_IDLE), sched_get_priority_max(SCHED_IDLE));
280*8d67ca89SAndroid Build Coastguard Worker   EXPECT_LE(sched_get_priority_min(SCHED_OTHER), sched_get_priority_max(SCHED_OTHER));
281*8d67ca89SAndroid Build Coastguard Worker   EXPECT_LE(sched_get_priority_min(SCHED_RR), sched_get_priority_max(SCHED_RR));
282*8d67ca89SAndroid Build Coastguard Worker }
283*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,sched_getscheduler_sched_setscheduler)284*8d67ca89SAndroid Build Coastguard Worker TEST(sched, sched_getscheduler_sched_setscheduler) {
285*8d67ca89SAndroid Build Coastguard Worker   // POSIX: "If pid is zero, the scheduling policy shall be returned for the
286*8d67ca89SAndroid Build Coastguard Worker   // calling process".
287*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(sched_getscheduler(getpid()), sched_getscheduler(0));
288*8d67ca89SAndroid Build Coastguard Worker 
289*8d67ca89SAndroid Build Coastguard Worker   const int original_policy = sched_getscheduler(getpid());
290*8d67ca89SAndroid Build Coastguard Worker   sched_param p = {};
291*8d67ca89SAndroid Build Coastguard Worker   p.sched_priority = sched_get_priority_min(original_policy);
292*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
293*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, sched_setscheduler(getpid(), INT_MAX, &p));
294*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
295*8d67ca89SAndroid Build Coastguard Worker 
296*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, sched_getparam(getpid(), &p));
297*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(original_policy, sched_setscheduler(getpid(), SCHED_BATCH, &p));
298*8d67ca89SAndroid Build Coastguard Worker   // POSIX says this should return the previous policy (here SCHED_BATCH),
299*8d67ca89SAndroid Build Coastguard Worker   // but the Linux system call doesn't, and the glibc wrapper doesn't correct
300*8d67ca89SAndroid Build Coastguard Worker   // this (the "returns 0" behavior is even documented on the man page in
301*8d67ca89SAndroid Build Coastguard Worker   // the BUGS section). This was our historical behavior too, so in the
302*8d67ca89SAndroid Build Coastguard Worker   // absence of reasons to break compatibility with ourselves and glibc, we
303*8d67ca89SAndroid Build Coastguard Worker   // don't behave as POSIX specifies. http://b/26203902.
304*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, sched_setscheduler(getpid(), original_policy, &p));
305*8d67ca89SAndroid Build Coastguard Worker }
306*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,sched_getaffinity_failure)307*8d67ca89SAndroid Build Coastguard Worker TEST(sched, sched_getaffinity_failure) {
308*8d67ca89SAndroid Build Coastguard Worker   // Trivial test of the errno-preserving/returning behavior.
309*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic push
310*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wnonnull"
311*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, sched_getaffinity(getpid(), 0, nullptr));
312*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
313*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic pop
314*8d67ca89SAndroid Build Coastguard Worker }
315*8d67ca89SAndroid Build Coastguard Worker 
TEST(pthread,sched_getaffinity)316*8d67ca89SAndroid Build Coastguard Worker TEST(pthread, sched_getaffinity) {
317*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
318*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
319*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, sched_getaffinity(getpid(), sizeof(set), &set));
320*8d67ca89SAndroid Build Coastguard Worker   ASSERT_GT(CPU_COUNT(&set), 0);
321*8d67ca89SAndroid Build Coastguard Worker }
322*8d67ca89SAndroid Build Coastguard Worker 
TEST(sched,sched_setaffinity_failure)323*8d67ca89SAndroid Build Coastguard Worker TEST(sched, sched_setaffinity_failure) {
324*8d67ca89SAndroid Build Coastguard Worker   // Trivial test of the errno-preserving/returning behavior.
325*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic push
326*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wnonnull"
327*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, sched_setaffinity(getpid(), 0, nullptr));
328*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
329*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic pop
330*8d67ca89SAndroid Build Coastguard Worker }
331*8d67ca89SAndroid Build Coastguard Worker 
TEST(pthread,sched_setaffinity)332*8d67ca89SAndroid Build Coastguard Worker TEST(pthread, sched_setaffinity) {
333*8d67ca89SAndroid Build Coastguard Worker   cpu_set_t set;
334*8d67ca89SAndroid Build Coastguard Worker   CPU_ZERO(&set);
335*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, sched_getaffinity(getpid(), sizeof(set), &set));
336*8d67ca89SAndroid Build Coastguard Worker   // It's hard to make any more general claim than this,
337*8d67ca89SAndroid Build Coastguard Worker   // but it ought to be safe to ask for the same affinity you already have.
338*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, sched_setaffinity(getpid(), sizeof(set), &set));
339*8d67ca89SAndroid Build Coastguard Worker }
340