source: rtems/testsuites/smptests/smpscheduler02/init.c @ c0bd006

5
Last change on this file since c0bd006 was c0bd006, checked in by Sebastian Huber <sebastian.huber@…>, on 06/30/16 at 12:08:18

rtems: Fix rtems_task_set_scheduler() API

Task priorities are only valid within a scheduler instance. The
rtems_task_set_scheduler() directive moves a task from one scheduler
instance to another using the current priority of the thread. However,
the current task priority of the source scheduler instance is undefined
in the target scheduler instance. Add a third parameter to specify the
priority.

Close #2749.

  • Property mode set to 100644
File size: 9.6 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 <sched.h>
20
21#include <rtems.h>
22#include <rtems/libcsupport.h>
23
24#include "tmacros.h"
25
26const char rtems_test_name[] = "SMPSCHEDULER 2";
27
28#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
29
30#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
31
32#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
33
34#define SCHED_C rtems_build_name(' ', ' ', ' ', 'C')
35
36static rtems_id main_task_id;
37
38static rtems_id sema_id;
39
40static void task(rtems_task_argument arg)
41{
42  rtems_status_code sc;
43
44  (void) arg;
45
46  rtems_test_assert(rtems_get_current_processor() == 1);
47  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
48  rtems_test_assert(sched_get_priority_max(SCHED_RR) == 126);
49
50  sc = rtems_semaphore_obtain(sema_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
51  rtems_test_assert(sc == RTEMS_NOT_DEFINED);
52
53  sc = rtems_event_transient_send(main_task_id);
54  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
55
56  while (1) {
57    /* Do nothing */
58  }
59}
60
61static void test(void)
62{
63  rtems_status_code sc;
64  rtems_id task_id;
65  rtems_id scheduler_id;
66  rtems_id scheduler_a_id;
67  rtems_id scheduler_b_id;
68  rtems_id scheduler_c_id;
69  rtems_task_priority prio;
70  cpu_set_t cpuset;
71  cpu_set_t first_cpu;
72  cpu_set_t second_cpu;
73  cpu_set_t all_cpus;
74  uint32_t cpu_count;
75
76  main_task_id = rtems_task_self();
77
78  CPU_ZERO(&first_cpu);
79  CPU_SET(0, &first_cpu);
80
81  CPU_ZERO(&second_cpu);
82  CPU_SET(1, &second_cpu);
83
84  CPU_ZERO(&all_cpus);
85  CPU_SET(0, &all_cpus);
86  CPU_SET(1, &all_cpus);
87
88  cpu_count = rtems_get_processor_count();
89
90  rtems_test_assert(rtems_get_current_processor() == 0);
91
92  sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
93  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
94
95  if (cpu_count > 1) {
96    sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
97    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
98    rtems_test_assert(scheduler_a_id != scheduler_b_id);
99  }
100
101  sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id);
102  rtems_test_assert(sc == RTEMS_UNSATISFIED);
103
104  sc = rtems_semaphore_create(
105    SCHED_A,
106    1,
107    RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING,
108    1,
109    &sema_id
110  );
111  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
112
113  prio = 2;
114  sc = rtems_semaphore_set_priority(sema_id, scheduler_a_id, prio, &prio);
115  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
116  rtems_test_assert(prio == 1);
117
118  if (cpu_count > 1) {
119    prio = 1;
120    sc = rtems_semaphore_set_priority(sema_id, scheduler_b_id, prio, &prio);
121    rtems_test_assert(sc == RTEMS_NOT_DEFINED);
122    rtems_test_assert(prio == 2);
123  }
124
125  CPU_ZERO(&cpuset);
126  sc = rtems_scheduler_get_processor_set(
127    scheduler_a_id,
128    sizeof(cpuset),
129    &cpuset
130  );
131  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
132  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
133
134  if (cpu_count > 1) {
135    CPU_ZERO(&cpuset);
136    sc = rtems_scheduler_get_processor_set(
137      scheduler_b_id,
138      sizeof(cpuset),
139      &cpuset
140    );
141    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
142    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
143  }
144
145  sc = rtems_task_create(
146    rtems_build_name('T', 'A', 'S', 'K'),
147    1,
148    RTEMS_MINIMUM_STACK_SIZE,
149    RTEMS_DEFAULT_MODES,
150    RTEMS_DEFAULT_ATTRIBUTES,
151    &task_id
152  );
153  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
154
155  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
156  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
157  rtems_test_assert(scheduler_id == scheduler_a_id);
158
159  CPU_ZERO(&cpuset);
160  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
161  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
162  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
163
164  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
165  rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254);
166
167  if (cpu_count > 1) {
168    sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
169    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
170
171    sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1, 1);
172    rtems_test_assert(sc == RTEMS_INVALID_ID);
173
174    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
175    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
176    rtems_test_assert(scheduler_id == scheduler_b_id);
177
178    CPU_ZERO(&cpuset);
179    sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
180    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
181    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
182
183    sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
184    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
185
186    sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu);
187    rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
188
189    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
190    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
191    rtems_test_assert(scheduler_id == scheduler_b_id);
192
193    sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
194    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
195
196    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
197    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
198    rtems_test_assert(scheduler_id == scheduler_b_id);
199
200    sc = rtems_task_start(task_id, task, 0);
201    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
202
203    sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
204    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
205
206    sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
207    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
208  }
209
210  sc = rtems_task_delete(task_id);
211  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
212
213  sc = rtems_semaphore_delete(sema_id);
214  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
215}
216
217#else /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
218
219static void test(void)
220{
221  /* Nothing to do */
222}
223
224#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
225
226static void Init(rtems_task_argument arg)
227{
228  rtems_resource_snapshot snapshot;
229
230  TEST_BEGIN();
231
232  rtems_resource_snapshot_take(&snapshot);
233
234  test();
235
236  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
237
238  TEST_END();
239  rtems_test_exit(0);
240}
241
242#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
243#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
244
245#define CONFIGURE_MAXIMUM_TASKS 2
246#define CONFIGURE_MAXIMUM_SEMAPHORES 1
247
248#define CONFIGURE_SMP_APPLICATION
249
250/* Lets see when the first RTEMS system hits this limit */
251#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 64
252
253#define CONFIGURE_SCHEDULER_PRIORITY_SMP
254#define CONFIGURE_SCHEDULER_SIMPLE_SMP
255
256#include <rtems/scheduler.h>
257
258RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, 256);
259
260RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, 128);
261
262RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(c);
263
264#define CONFIGURE_SCHEDULER_CONTROLS \
265  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
266  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B), \
267  RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(c, SCHED_C)
268
269#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
270  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
271  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
272  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
273  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
274  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
275  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
276  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
277  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
278  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
279  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
280  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
281  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
282  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
283  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
284  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
285  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
286  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
287  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
288  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
289  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
290  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
291  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
292  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
293  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
294  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
295  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
296  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
297  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
298  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
299  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
300  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
301  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
302  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
303  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
304
305#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
306
307#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
308
309#define CONFIGURE_INIT
310
311#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.