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