source: rtems/testsuites/sptests/spmrsp01/init.c @ c7f748a

5
Last change on this file since c7f748a was c7f748a, checked in by Sebastian Huber <sebastian.huber@…>, on 02/15/20 at 11:07:28

config: Remove CONFIGURE_DISABLE_SMP_CONFIGURATION

The CONFIGURE_DISABLE_SMP_CONFIGURATION configuration option and
rtems_configuration_is_smp_enabled() were added during the SMP support
development cycle as a workaround to fix some testsuite failures in SMP
configurations. All use cases were replaced with tests for specific
conditions. The configuration option and test macro were undocumented.

Close #3876.

  • Property mode set to 100644
File size: 7.9 KB
Line 
1/*
2 * Copyright (c) 2014 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 "tmacros.h"
23
24const char rtems_test_name[] = "SPMRSP 1";
25
26typedef struct {
27  rtems_id semaphore_id;
28  rtems_id task_id;
29} test_mrsp_context;
30
31static void create_not_defined(rtems_attribute attr)
32{
33  rtems_status_code sc;
34  rtems_id id;
35
36  sc = rtems_semaphore_create(
37    rtems_build_name('M', 'R', 'S', 'P'),
38    1,
39    attr,
40    0,
41    &id
42  );
43  rtems_test_assert(sc == RTEMS_NOT_DEFINED);
44}
45
46static void test_mrsp_create_errors(void)
47{
48  rtems_status_code sc;
49  rtems_id id;
50
51  puts("test MrsP create errors");
52
53  sc = rtems_semaphore_create(
54    rtems_build_name('M', 'R', 'S', 'P'),
55    1,
56    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
57      | RTEMS_BINARY_SEMAPHORE,
58    UINT32_MAX,
59    &id
60  );
61  rtems_test_assert(sc == RTEMS_INVALID_PRIORITY);
62
63  create_not_defined(
64    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
65      | RTEMS_COUNTING_SEMAPHORE
66  );
67
68  create_not_defined(
69    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
70      | RTEMS_SIMPLE_BINARY_SEMAPHORE
71  );
72
73  create_not_defined(
74    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
75      | RTEMS_BINARY_SEMAPHORE
76      | RTEMS_PRIORITY
77  );
78
79  create_not_defined(
80    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
81      | RTEMS_INHERIT_PRIORITY
82      | RTEMS_BINARY_SEMAPHORE
83  );
84
85  create_not_defined(
86    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
87      | RTEMS_PRIORITY_CEILING
88      | RTEMS_BINARY_SEMAPHORE
89  );
90
91  create_not_defined(
92    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
93      | RTEMS_INHERIT_PRIORITY
94      | RTEMS_PRIORITY_CEILING
95      | RTEMS_BINARY_SEMAPHORE
96  );
97}
98
99static void assert_prio(rtems_task_priority expected_prio)
100{
101  rtems_status_code sc;
102  rtems_task_priority prio;
103
104  sc = rtems_task_set_priority(RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio);
105  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
106  rtems_test_assert(prio == expected_prio);
107}
108
109static void test_mrsp_obtain_release(void)
110{
111  rtems_status_code sc;
112  rtems_id id;
113
114  puts("test MrsP obtain and release");
115
116  sc = rtems_semaphore_create(
117    rtems_build_name('M', 'R', 'S', 'P'),
118    1,
119    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
120      | RTEMS_BINARY_SEMAPHORE,
121    1,
122    &id
123  );
124  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
125
126  assert_prio(2);
127
128  sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
129  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
130
131  assert_prio(1);
132
133  sc = rtems_semaphore_delete(id);
134  rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
135
136  sc = rtems_semaphore_release(id);
137  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
138
139  assert_prio(2);
140
141  sc = rtems_semaphore_delete(id);
142  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
143}
144
145static void test_mrsp_set_priority_errors(void)
146{
147  rtems_status_code sc;
148  rtems_id id;
149  rtems_id scheduler_id;
150  rtems_task_priority prio;
151
152  puts("test MrsP set priority errors");
153
154  sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
155  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
156
157  sc = rtems_semaphore_create(
158    rtems_build_name('C', 'O', 'N', 'T'),
159    0,
160    RTEMS_COUNTING_SEMAPHORE,
161    0,
162    &id
163  );
164  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
165
166  prio = 1;
167  sc = rtems_semaphore_set_priority(RTEMS_ID_NONE, scheduler_id, prio, &prio);
168  rtems_test_assert(sc == RTEMS_INVALID_ID);
169
170  prio = 1;
171  sc = rtems_semaphore_set_priority(id, RTEMS_ID_NONE, prio, &prio);
172  rtems_test_assert(sc == RTEMS_INVALID_ID);
173
174  prio = 0xffffffff;
175  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
176  rtems_test_assert(sc == RTEMS_INVALID_PRIORITY);
177
178  prio = 1;
179  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, NULL);
180  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
181
182  prio = 1;
183  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
184  rtems_test_assert(sc == RTEMS_NOT_DEFINED);
185
186  sc = rtems_semaphore_delete(id);
187  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
188}
189
190static void test_mrsp_set_priority(void)
191{
192  rtems_status_code sc;
193  rtems_id id;
194  rtems_id scheduler_id;
195  rtems_task_priority prio;
196
197  puts("test MrsP set priority");
198
199  sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
200  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
201
202  sc = rtems_semaphore_create(
203    rtems_build_name('M', 'R', 'S', 'P'),
204    1,
205    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
206      | RTEMS_BINARY_SEMAPHORE,
207    1,
208    &id
209  );
210  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
211
212  prio = RTEMS_CURRENT_PRIORITY;
213  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
214  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
215  rtems_test_assert(prio == 1);
216
217  prio = 1;
218  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
219  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
220  rtems_test_assert(prio == 1);
221
222  prio = 2;
223  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
224  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
225  rtems_test_assert(prio == 1);
226
227  prio = RTEMS_CURRENT_PRIORITY;
228  sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
229  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
230  rtems_test_assert(prio == 2);
231
232  sc = rtems_semaphore_delete(id);
233  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
234}
235
236static void test_mrsp_task(rtems_task_argument arg)
237{
238  test_mrsp_context *ctx = (test_mrsp_context *) arg;
239  rtems_status_code sc;
240
241  sc = rtems_semaphore_release(ctx->semaphore_id);
242  rtems_test_assert(sc == RTEMS_NOT_OWNER_OF_RESOURCE);
243
244  sc = rtems_semaphore_obtain(ctx->semaphore_id, RTEMS_NO_WAIT, 0);
245  rtems_test_assert(sc == RTEMS_UNSATISFIED);
246
247  sc = rtems_semaphore_obtain(ctx->semaphore_id, RTEMS_WAIT, 1);
248  rtems_test_assert(sc == RTEMS_TIMEOUT);
249
250  sc = rtems_event_transient_send(ctx->task_id);
251  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
252
253  rtems_task_exit();
254  rtems_test_assert(0);
255}
256
257static void test_mrsp_timeout_and_not_owner_of_resource(void)
258{
259  rtems_status_code sc;
260  rtems_id id;
261  rtems_id task_id;
262  test_mrsp_context ctx;
263
264  puts("test MrsP timeout and not owner of resource");
265
266  sc = rtems_semaphore_create(
267    rtems_build_name('M', 'R', 'S', 'P'),
268    1,
269    RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
270      | RTEMS_BINARY_SEMAPHORE,
271    1,
272    &id
273  );
274  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
275
276  sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
277  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
278
279  sc = rtems_task_create(
280    rtems_build_name('M', 'R', 'S', 'P'),
281    1,
282    RTEMS_MINIMUM_STACK_SIZE,
283    RTEMS_DEFAULT_MODES,
284    RTEMS_DEFAULT_ATTRIBUTES,
285    &task_id
286  );
287  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
288
289  ctx.semaphore_id = id;
290  ctx.task_id = rtems_task_self();
291
292  sc = rtems_task_start(task_id, test_mrsp_task, (rtems_task_argument) &ctx);
293  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
294
295  sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
296  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
297
298  sc = rtems_semaphore_release(id);
299  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
300
301  sc = rtems_semaphore_delete(id);
302  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
303}
304
305static void Init(rtems_task_argument arg)
306{
307  rtems_resource_snapshot snapshot;
308
309  TEST_BEGIN();
310
311  rtems_resource_snapshot_take(&snapshot);
312
313  test_mrsp_create_errors();
314  test_mrsp_obtain_release();
315  test_mrsp_set_priority_errors();
316  test_mrsp_set_priority();
317  test_mrsp_timeout_and_not_owner_of_resource();
318
319  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
320
321  TEST_END();
322  rtems_test_exit(0);
323}
324
325#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
326#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
327
328#define CONFIGURE_MAXIMUM_TASKS 2
329#define CONFIGURE_MAXIMUM_SEMAPHORES 1
330
331#define CONFIGURE_INIT_TASK_PRIORITY 2
332
333#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
334
335#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
336
337#define CONFIGURE_INIT
338
339#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.