source: rtems/testsuites/sptests/spscheduler01/init.c @ 05ca53d

5
Last change on this file since 05ca53d was 05ca53d, checked in by Sebastian Huber <sebastian.huber@…>, on 10/31/16 at 12:08:33

rtems: Add scheduler processor add/remove

Update #2797.

  • Property mode set to 100644
File size: 14.0 KB
Line 
1/*
2 * Copyright (c) 2014, 2016 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems.h>
20#include <rtems/libcsupport.h>
21
22#include <limits.h>
23
24#include "tmacros.h"
25
26const char rtems_test_name[] = "SPSCHEDULER 1";
27
28#define BLUE rtems_build_name('b', 'l', 'u', 'e')
29
30#define RED rtems_build_name('r', 'e', 'd', ' ')
31
32static const rtems_id invalid_id = 1;
33
34static rtems_id master_id;
35
36static rtems_id sema_id;
37
38static void test_task_get_set_affinity(void)
39{
40#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
41  rtems_id self_id = rtems_task_self();
42  rtems_id task_id;
43  rtems_status_code sc;
44  cpu_set_t cpusetone;
45  cpu_set_t cpuset;
46  size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
47  size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
48  cpu_set_t *cpusetbigone;
49  cpu_set_t *cpusetbig;
50
51  CPU_ZERO(&cpusetone);
52  CPU_SET(0, &cpusetone);
53
54  sc = rtems_task_create(
55    rtems_build_name('T', 'A', 'S', 'K'),
56    2,
57    RTEMS_MINIMUM_STACK_SIZE,
58    RTEMS_DEFAULT_MODES,
59    RTEMS_DEFAULT_ATTRIBUTES,
60    &task_id
61  );
62  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
63
64  sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
65  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
66
67  sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
68  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
69
70  sc = rtems_task_get_affinity(RTEMS_SELF, 0, &cpuset);
71  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
72
73  sc = rtems_task_set_affinity(RTEMS_SELF, 0, &cpuset);
74  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
75
76  sc = rtems_task_get_affinity(invalid_id, sizeof(cpuset), &cpuset);
77  rtems_test_assert(sc == RTEMS_INVALID_ID);
78
79  sc = rtems_task_set_affinity(invalid_id, sizeof(cpuset), &cpuset);
80  rtems_test_assert(sc == RTEMS_INVALID_ID);
81
82  sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
83  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
84
85  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
86
87  sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
88  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
89
90  sc = rtems_task_set_affinity(self_id, sizeof(cpuset), &cpuset);
91  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
92
93  sc = rtems_task_set_affinity(task_id, sizeof(cpuset), &cpuset);
94  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
95
96  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
97  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
98
99  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
100
101  cpusetbigone = CPU_ALLOC(big);
102  rtems_test_assert(cpusetbigone != NULL);
103
104  cpusetbig = CPU_ALLOC(big);
105  rtems_test_assert(cpusetbig != NULL);
106
107  CPU_ZERO_S(cpusetbigsize, cpusetbigone);
108  CPU_SET_S(0, cpusetbigsize, cpusetbigone);
109
110  sc = rtems_task_get_affinity(task_id, cpusetbigsize, cpusetbig);
111  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
112
113  rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
114
115  sc = rtems_task_set_affinity(task_id, cpusetbigsize, cpusetbig);
116  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
117
118  sc = rtems_task_delete(task_id);
119  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
120
121  CPU_FREE(cpusetbig);
122  CPU_FREE(cpusetbigone);
123#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
124}
125
126static rtems_task_priority set_prio(rtems_id id, rtems_task_priority prio)
127{
128  rtems_status_code sc;
129  rtems_task_priority old_prio;
130
131  old_prio = 0xffffffff;
132  sc = rtems_task_set_priority(id, prio, &old_prio);
133  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
134
135  return old_prio;
136}
137
138static void forbidden_task(rtems_task_argument arg)
139{
140  (void) arg;
141
142  rtems_test_assert(0);
143}
144
145static void restart_task(rtems_task_argument arg)
146{
147  rtems_status_code sc;
148
149  if (arg == 0) {
150    rtems_test_assert(set_prio(RTEMS_SELF, 3) == 2);
151
152    rtems_task_restart(RTEMS_SELF, 1);
153  } else if (arg == 1) {
154    rtems_id scheduler_id;
155
156    rtems_test_assert(set_prio(RTEMS_SELF, 3) == 2);
157
158    sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
159    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
160
161    sc = rtems_task_set_scheduler(RTEMS_SELF, scheduler_id, 4);
162    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
163
164    rtems_test_assert(set_prio(RTEMS_SELF, 3) == 4);
165
166    rtems_task_restart(RTEMS_SELF, 2);
167  } else {
168    rtems_test_assert(set_prio(RTEMS_SELF, 3) == 4);
169
170    rtems_task_resume(master_id);
171  }
172
173  rtems_test_assert(0);
174}
175
176static void sema_task(rtems_task_argument arg)
177{
178  rtems_status_code sc;
179
180  sc = rtems_semaphore_obtain(sema_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
181  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
182
183  rtems_test_assert(0);
184}
185
186static void test_task_get_set_scheduler(void)
187{
188  rtems_status_code sc;
189  rtems_id self_id = rtems_task_self();
190  rtems_name name = BLUE;
191  rtems_id scheduler_id;
192  rtems_id scheduler_by_name;
193  rtems_id task_id;
194  rtems_id mtx_id;
195
196  sc = rtems_scheduler_ident(name, &scheduler_by_name);
197  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
198
199  sc = rtems_task_get_scheduler(RTEMS_SELF, NULL);
200  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
201
202  sc = rtems_task_get_scheduler(invalid_id, &scheduler_id);
203  rtems_test_assert(sc == RTEMS_INVALID_ID);
204
205  scheduler_id = 0;
206  sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
207  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
208
209  rtems_test_assert(scheduler_id == scheduler_by_name);
210
211  scheduler_id = 0;
212  sc = rtems_task_get_scheduler(self_id, &scheduler_id);
213  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
214
215  rtems_test_assert(scheduler_id == scheduler_by_name);
216
217  sc = rtems_task_set_scheduler(invalid_id, scheduler_id, 1);
218  rtems_test_assert(sc == RTEMS_INVALID_ID);
219
220  sc = rtems_task_set_scheduler(self_id, invalid_id, 1);
221  rtems_test_assert(sc == RTEMS_INVALID_ID);
222
223  sc = rtems_task_set_scheduler(self_id, scheduler_id, UINT32_C(0x80000000));
224  rtems_test_assert(sc == RTEMS_INVALID_PRIORITY);
225
226  sc = rtems_task_set_scheduler(self_id, scheduler_id, 1);
227  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
228
229  sc = rtems_semaphore_create(
230    rtems_build_name(' ', 'M', 'T', 'X'),
231    0,
232    RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
233    0,
234    &mtx_id
235  );
236  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
237
238  sc = rtems_task_set_scheduler(self_id, scheduler_id, 1);
239  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
240
241  sc = rtems_semaphore_release(mtx_id);
242  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
243
244  rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1);
245
246  sc = rtems_task_set_scheduler(self_id, scheduler_id, 2);
247  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
248
249  rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 2);
250
251  sc = rtems_task_set_scheduler(self_id, scheduler_id, 1);
252  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
253
254  rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1);
255
256  sc = rtems_semaphore_delete(mtx_id);
257  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
258
259  sc = rtems_task_create(
260    rtems_build_name('T', 'A', 'S', 'K'),
261    2,
262    RTEMS_MINIMUM_STACK_SIZE,
263    RTEMS_DEFAULT_MODES,
264    RTEMS_DEFAULT_ATTRIBUTES,
265    &task_id
266  );
267  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
268
269  scheduler_id = 0;
270  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
271  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
272
273  rtems_test_assert(scheduler_id == scheduler_by_name);
274
275  sc = rtems_task_set_scheduler(task_id, scheduler_id, 2);
276  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
277
278  sc = rtems_task_start(task_id, forbidden_task, 0);
279  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
280
281  sc = rtems_task_set_scheduler(task_id, scheduler_id, 2);
282  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
283
284  sc = rtems_task_delete(task_id);
285  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
286
287  sc = rtems_task_create(
288    rtems_build_name('T', 'A', 'S', 'K'),
289    2,
290    RTEMS_MINIMUM_STACK_SIZE,
291    RTEMS_DEFAULT_MODES,
292    RTEMS_DEFAULT_ATTRIBUTES,
293    &task_id
294  );
295  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
296
297  sc = rtems_task_start(task_id, restart_task, 0);
298  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
299
300  sc = rtems_task_suspend(self_id);
301  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
302
303  sc = rtems_task_delete(task_id);
304  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
305
306  sc = rtems_semaphore_create(
307    rtems_build_name('S', 'E', 'M', 'A'),
308    0,
309    RTEMS_COUNTING_SEMAPHORE,
310    0,
311    &sema_id
312  );
313  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
314
315  sc = rtems_task_create(
316    rtems_build_name('T', 'A', 'S', 'K'),
317    1,
318    RTEMS_MINIMUM_STACK_SIZE,
319    RTEMS_DEFAULT_MODES,
320    RTEMS_DEFAULT_ATTRIBUTES,
321    &task_id
322  );
323  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
324
325  sc = rtems_task_start(task_id, sema_task, 0);
326  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
327
328  sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR);
329  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
330
331  sc = rtems_task_set_scheduler(task_id, scheduler_id, 1);
332  rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
333
334  sc = rtems_semaphore_delete(sema_id);
335  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
336
337  sc = rtems_task_delete(task_id);
338  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
339}
340
341static void test_scheduler_ident(void)
342{
343  rtems_status_code sc;
344  rtems_id expected_id = rtems_build_id(7, 1, 1, 1);
345  rtems_id scheduler_id;
346  rtems_name name = BLUE;
347  rtems_name invalid_name = RED;
348
349  sc = rtems_scheduler_ident(name, NULL);
350  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
351
352  sc = rtems_scheduler_ident(invalid_name, &scheduler_id);
353  rtems_test_assert(sc == RTEMS_INVALID_NAME);
354
355  scheduler_id = 0;
356  sc = rtems_scheduler_ident(name, &scheduler_id);
357  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
358
359  rtems_test_assert(scheduler_id == expected_id);
360}
361
362static void test_scheduler_get_processors(void)
363{
364#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
365  rtems_status_code sc;
366  rtems_name name = BLUE;
367  rtems_id scheduler_id;
368  cpu_set_t cpusetone;
369  cpu_set_t cpuset;
370  size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
371  size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
372  cpu_set_t *cpusetbigone;
373  cpu_set_t *cpusetbig;
374
375  CPU_ZERO(&cpusetone);
376  CPU_SET(0, &cpusetone);
377
378  sc = rtems_scheduler_ident(name, &scheduler_id);
379  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
380
381  sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), NULL);
382  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
383
384  sc = rtems_scheduler_get_processor_set(invalid_id, sizeof(cpuset), &cpuset);
385  rtems_test_assert(sc == RTEMS_INVALID_ID);
386
387  sc = rtems_scheduler_get_processor_set(scheduler_id, 0, &cpuset);
388  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
389
390  sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), &cpuset);
391  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
392
393  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
394
395  cpusetbigone = CPU_ALLOC(big);
396  rtems_test_assert(cpusetbigone != NULL);
397
398  cpusetbig = CPU_ALLOC(big);
399  rtems_test_assert(cpusetbig != NULL);
400
401  CPU_ZERO_S(cpusetbigsize, cpusetbigone);
402  CPU_SET_S(0, cpusetbigsize, cpusetbigone);
403
404  sc = rtems_scheduler_get_processor_set(scheduler_id, cpusetbigsize, cpusetbig);
405  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
406
407  rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
408
409  CPU_FREE(cpusetbig);
410  CPU_FREE(cpusetbigone);
411#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
412}
413
414static void test_scheduler_add_remove_processors(void)
415{
416  rtems_status_code sc;
417  rtems_id scheduler_id;
418
419  sc = rtems_scheduler_ident(BLUE, &scheduler_id);
420  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
421
422  sc = rtems_scheduler_add_processor(invalid_id, 0);
423  rtems_test_assert(sc == RTEMS_INVALID_ID);
424
425  sc = rtems_scheduler_remove_processor(invalid_id, 0);
426  rtems_test_assert(sc == RTEMS_INVALID_ID);
427
428  sc = rtems_scheduler_add_processor(scheduler_id, 1);
429  rtems_test_assert(sc == RTEMS_NOT_CONFIGURED);
430
431  sc = rtems_scheduler_remove_processor(scheduler_id, 1);
432  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
433
434  sc = rtems_scheduler_add_processor(scheduler_id, 0);
435  rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
436
437  sc = rtems_scheduler_remove_processor(scheduler_id, 0);
438  rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
439}
440
441static void test_task_get_priority(void)
442{
443  rtems_status_code sc;
444  rtems_id scheduler_id;
445  rtems_task_priority priority;
446  rtems_task_priority priority_2;
447
448  sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
449  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
450
451  sc = rtems_task_get_priority(RTEMS_SELF, scheduler_id, NULL);
452  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
453
454  priority = 0;
455
456  sc = rtems_task_get_priority(RTEMS_SELF, invalid_id, &priority);
457  rtems_test_assert(sc == RTEMS_INVALID_ID);
458  rtems_test_assert(priority == 0);
459
460  sc = rtems_task_get_priority(invalid_id, scheduler_id, &priority);
461  rtems_test_assert(sc == RTEMS_INVALID_ID);
462  rtems_test_assert(priority == 0);
463
464  sc = rtems_task_set_priority(RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &priority);
465  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
466  rtems_test_assert(priority != 0);
467
468  priority_2 = 0;
469  sc = rtems_task_get_priority(RTEMS_SELF, scheduler_id, &priority_2);
470  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
471  rtems_test_assert(priority_2 == priority);
472
473  priority_2 = 0;
474  sc = rtems_task_get_priority(rtems_task_self(), scheduler_id, &priority_2);
475  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
476  rtems_test_assert(priority_2 == priority);
477}
478
479static void Init(rtems_task_argument arg)
480{
481  rtems_resource_snapshot snapshot;
482
483  TEST_BEGIN();
484
485  rtems_resource_snapshot_take(&snapshot);
486
487  master_id = rtems_task_self();
488
489  test_task_get_set_affinity();
490  test_task_get_set_scheduler();
491  test_scheduler_ident();
492  test_scheduler_get_processors();
493  test_scheduler_add_remove_processors();
494  test_task_get_priority();
495
496  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
497
498  TEST_END();
499  rtems_test_exit(0);
500}
501
502#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
503#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
504
505#define CONFIGURE_MAXIMUM_TASKS 2
506#define CONFIGURE_MAXIMUM_SEMAPHORES 1
507
508#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
509
510#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
511
512#define CONFIGURE_SCHEDULER_NAME BLUE
513
514#define CONFIGURE_INIT
515
516#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.