source: rtems/testsuites/psxtests/psxconfig01/init.c @ 97417bb

5
Last change on this file since 97417bb was 97417bb, checked in by Sebastian Huber <sebastian.huber@…>, on 08/07/18 at 05:09:55

tests: Remove CONFIGURE_MAXIMUM_DRIVERS

This configuration is superfluous in these tests.

  • Property mode set to 100644
File size: 13.0 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup psxtests
5 *
6 * @brief Test that the workspace size estimate is correct.
7 */
8
9/*
10 * Copyright (c) 2014. On-Line Applications Research Corporation (OAR).
11 * Copyright (c) 2011-2014 embedded brains GmbH.  All rights reserved.
12 *
13 *  embedded brains GmbH
14 *  Dornierstr. 4
15 *  82178 Puchheim
16 *  Germany
17 *  <rtems@embedded-brains.de>
18 *
19 * The license and distribution terms for this file may be
20 * found in the file LICENSE in this distribution or at
21 * http://www.rtems.org/license/LICENSE.
22 */
23
24#ifdef HAVE_CONFIG_H
25  #include "config.h"
26#endif
27
28#include <rtems/test.h>
29#include <tmacros.h>
30
31#include <sys/stat.h>
32#include <fcntl.h>
33#include <inttypes.h>
34#include <mqueue.h>
35#include <pthread.h>
36#include <semaphore.h>
37#include <signal.h>
38#include <stdio.h>
39#include <time.h>
40#include <limits.h>
41
42#include <rtems/libcsupport.h>
43
44const char rtems_test_name[] = "PSXCONFIG 1";
45
46#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5
47
48#define CONFIGURE_MAXIMUM_POSIX_KEYS 23
49#ifdef CONFIGURE_MAXIMUM_POSIX_KEYS
50  #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS CONFIGURE_MAXIMUM_POSIX_KEYS
51#endif
52
53#define CONFIGURE_MAXIMUM_BARRIERS 2
54#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 7
55#define CONFIGURE_MAXIMUM_PARTITIONS 37
56#define CONFIGURE_MAXIMUM_PERIODS 41
57#define CONFIGURE_MAXIMUM_REGIONS 43
58#define CONFIGURE_MAXIMUM_SEMAPHORES 47
59#define CONFIGURE_MAXIMUM_TASKS 11
60#define CONFIGURE_MAXIMUM_TIMERS 59
61#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 17
62
63#define POSIX_MQ_COUNT 5
64#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 7
65#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 41
66#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
67
68#define CONFIGURE_MAXIMUM_POSIX_THREADS 3
69#define CONFIGURE_MAXIMUM_POSIX_TIMERS 47
70
71#ifndef CONFIGURE_MAXIMUM_TASKS
72  #define CONFIGURE_MAXIMUM_TASKS 1
73#endif
74
75#ifdef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
76  #define MQ_0_COUNT 2
77  #define MQ_1_COUNT 3
78  #define MQ_2_COUNT 5
79  #define MQ_3_COUNT 7
80  #define MQ_4_COUNT 11
81  #define MQ_5_COUNT 13
82  #define MQ_6_COUNT 17
83
84  #define MQ_0_SIZE 101
85  #define MQ_1_SIZE 103
86  #define MQ_2_SIZE 107
87  #define MQ_3_SIZE 109
88  #define MQ_4_SIZE 113
89  #define MQ_5_SIZE 127
90  #define MQ_6_SIZE 131
91
92  #define MQ_BUFFER_MEMORY \
93    (CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_0_COUNT, MQ_0_SIZE) \
94      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_1_COUNT, MQ_1_SIZE) \
95      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_2_COUNT, MQ_2_SIZE) \
96      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_3_COUNT, MQ_3_SIZE) \
97      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_4_COUNT, MQ_4_SIZE) \
98      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_5_COUNT, MQ_5_SIZE) \
99      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MQ_6_COUNT, MQ_6_SIZE))
100
101  static const uint8_t mq_counts [CONFIGURE_MAXIMUM_MESSAGE_QUEUES] = {
102    MQ_0_COUNT,
103    MQ_1_COUNT,
104    MQ_2_COUNT,
105    MQ_3_COUNT,
106    MQ_4_COUNT,
107    MQ_5_COUNT,
108    MQ_6_COUNT
109  };
110
111  static const uint8_t mq_sizes [CONFIGURE_MAXIMUM_MESSAGE_QUEUES] = {
112    MQ_0_SIZE,
113    MQ_1_SIZE,
114    MQ_2_SIZE,
115    MQ_3_SIZE,
116    MQ_4_SIZE,
117    MQ_5_SIZE,
118    MQ_6_SIZE
119  };
120#else
121  #define MQ_BUFFER_MEMORY 0
122#endif
123
124#ifdef POSIX_MQ_COUNT
125  #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES POSIX_MQ_COUNT
126
127  #define POSIX_MQ_0_COUNT 2
128  #define POSIX_MQ_1_COUNT 3
129  #define POSIX_MQ_2_COUNT 5
130  #define POSIX_MQ_3_COUNT 7
131  #define POSIX_MQ_4_COUNT 11
132
133  #define POSIX_MQ_0_SIZE 137
134  #define POSIX_MQ_1_SIZE 139
135  #define POSIX_MQ_2_SIZE 149
136  #define POSIX_MQ_3_SIZE 151
137  #define POSIX_MQ_4_SIZE 157
138
139  #define POSIX_MQ_BUFFER_MEMORY \
140    (CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(POSIX_MQ_0_COUNT, POSIX_MQ_0_SIZE) \
141      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(POSIX_MQ_1_COUNT, POSIX_MQ_1_SIZE) \
142      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(POSIX_MQ_2_COUNT, POSIX_MQ_2_SIZE) \
143      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(POSIX_MQ_3_COUNT, POSIX_MQ_3_SIZE) \
144      + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(POSIX_MQ_4_COUNT, POSIX_MQ_4_SIZE))
145
146  static const uint8_t posix_mq_counts [POSIX_MQ_COUNT] = {
147    POSIX_MQ_0_COUNT,
148    POSIX_MQ_1_COUNT,
149    POSIX_MQ_2_COUNT,
150    POSIX_MQ_3_COUNT,
151    POSIX_MQ_4_COUNT
152  };
153
154  static const uint8_t posix_mq_sizes [POSIX_MQ_COUNT] = {
155    POSIX_MQ_0_SIZE,
156    POSIX_MQ_1_SIZE,
157    POSIX_MQ_2_SIZE,
158    POSIX_MQ_3_SIZE,
159    POSIX_MQ_4_SIZE
160  };
161#else
162  #define POSIX_MQ_BUFFER_MEMORY 0
163#endif
164
165#define CONFIGURE_MESSAGE_BUFFER_MEMORY \
166  (MQ_BUFFER_MEMORY + POSIX_MQ_BUFFER_MEMORY)
167
168#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
169#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
170
171#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
172
173#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
174
175#define CONFIGURE_INIT
176
177static rtems_task Init(rtems_task_argument argument);
178
179#include <rtems/confdefs.h>
180
181typedef struct {
182  uint64_t data [16];
183} area;
184
185#ifdef CONFIGURE_MAXIMUM_PARTITIONS
186  static area partition_areas [CONFIGURE_MAXIMUM_PARTITIONS];
187#endif
188
189#ifdef CONFIGURE_MAXIMUM_REGIONS
190  static area region_areas [CONFIGURE_MAXIMUM_REGIONS];
191#endif
192
193static char posix_name [_POSIX_PATH_MAX + 1];
194
195static char *get_posix_name(char a, char b, char c, int i)
196{
197  posix_name [_POSIX_PATH_MAX - 4] = a;
198  posix_name [_POSIX_PATH_MAX - 3] = b;
199  posix_name [_POSIX_PATH_MAX - 2] = c;
200  posix_name [_POSIX_PATH_MAX - 1] = 'A' + i;
201
202  return posix_name;
203}
204
205static void *posix_thread(void *arg RTEMS_UNUSED)
206{
207  rtems_test_assert(0);
208}
209
210static void posix_key_dtor(void *key RTEMS_UNUSED)
211{
212  /* Do nothing */
213}
214
215static void print_info(void)
216{
217  Heap_Information_block info;
218  bool ok = rtems_workspace_get_information(&info);
219  rtems_test_assert(ok);
220
221  printf(
222    "used blocks = %" PRIuPTR ", "
223    "largest used block = %" PRIuPTR ", "
224    "used space = %" PRIuPTR "\n"
225    "free blocks = %" PRIuPTR ", "
226    "largest free block = %" PRIuPTR ", "
227    "free space = %" PRIuPTR "\n",
228    info.Used.number,
229    info.Used.largest,
230    info.Used.total,
231    info.Free.number,
232    info.Free.largest,
233    info.Free.total
234  );
235}
236
237static rtems_task Init(rtems_task_argument argument)
238{
239  rtems_status_code sc = RTEMS_SUCCESSFUL;
240  int eno = 0;
241  int rv = 0;
242  rtems_id id = RTEMS_ID_NONE;
243  rtems_name name = rtems_build_name('C', 'O', 'N', 'F');
244  rtems_extensions_table table;
245  rtems_resource_snapshot snapshot;
246  int i = 0;
247  pthread_key_t key;
248
249  TEST_BEGIN();
250
251  memset(posix_name, 'P', sizeof(posix_name) - 1);
252
253  print_info();
254
255  rtems_resource_snapshot_take(&snapshot);
256  rtems_test_assert(rtems_resource_snapshot_equal(&snapshot, &snapshot));
257  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
258
259#ifdef CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
260  for (i = 3; i < CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS; ++i) {
261    int oflag = O_WRONLY | O_CREAT | O_TRUNC;
262    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
263    char path [] = { 'F', 'I', 'L', 'E', 'A' + i, '\0' };
264    int fd = open(path, oflag, mode);
265    rtems_test_assert(fd == i);
266  }
267  rtems_resource_snapshot_take(&snapshot);
268  rtems_test_assert(
269    snapshot.open_files == CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
270  );
271#endif
272
273#ifdef CONFIGURE_MAXIMUM_USER_EXTENSIONS
274  memset(&table, 0, sizeof(table));
275  for (i = 0; i < CONFIGURE_MAXIMUM_USER_EXTENSIONS; ++i) {
276    sc = rtems_extension_create(name, &table, &id);
277    directive_failed(sc, "rtems_extension_create");
278  }
279  rtems_resource_snapshot_take(&snapshot);
280  rtems_test_assert(
281    snapshot.rtems_api.active_extensions == CONFIGURE_MAXIMUM_USER_EXTENSIONS
282  );
283#endif
284
285#ifdef CONFIGURE_MAXIMUM_POSIX_KEYS
286  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_KEYS; ++i) {
287    eno = pthread_key_create(&key, posix_key_dtor);
288    rtems_test_assert(eno == 0);
289
290    eno = pthread_setspecific(key, (void *) (uintptr_t)(i + 1));
291    rtems_test_assert(eno == 0);
292  }
293  eno = pthread_key_create(&key, posix_key_dtor);
294  rtems_test_assert(eno == EAGAIN);
295  rtems_resource_snapshot_take(&snapshot);
296  rtems_test_assert(
297    snapshot.active_posix_keys == _CONFIGURE_POSIX_KEYS
298  );
299  rtems_test_assert(
300    snapshot.active_posix_key_value_pairs == CONFIGURE_MAXIMUM_POSIX_KEYS
301  );
302#else
303  (void) key;
304#endif
305
306#ifdef CONFIGURE_MAXIMUM_BARRIERS
307  for (i = 0; i < CONFIGURE_MAXIMUM_BARRIERS; ++i) {
308    sc = rtems_barrier_create(name, RTEMS_DEFAULT_ATTRIBUTES, 1, &id);
309    directive_failed(sc, "rtems_barrier_create");
310  }
311  rtems_resource_snapshot_take(&snapshot);
312  rtems_test_assert(
313    snapshot.rtems_api.active_barriers == CONFIGURE_MAXIMUM_BARRIERS
314  );
315#endif
316
317#ifdef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
318  for (i = 0; i < CONFIGURE_MAXIMUM_MESSAGE_QUEUES; ++i) {
319    sc = rtems_message_queue_create(
320      name,
321      mq_counts [i],
322      mq_sizes [i],
323      RTEMS_DEFAULT_ATTRIBUTES,
324      &id
325    );
326    directive_failed(sc, "rtems_message_queue_create");
327  }
328  rtems_resource_snapshot_take(&snapshot);
329  rtems_test_assert(
330    snapshot.rtems_api.active_message_queues
331      == CONFIGURE_MAXIMUM_MESSAGE_QUEUES
332  );
333#endif
334
335#ifdef CONFIGURE_MAXIMUM_PARTITIONS
336  for (i = 0; i < CONFIGURE_MAXIMUM_PARTITIONS; ++i) {
337    sc = rtems_partition_create(
338      name,
339      partition_areas + i,
340      sizeof(partition_areas [0]),
341      sizeof(partition_areas [0]),
342      RTEMS_DEFAULT_ATTRIBUTES,
343      &id
344    );
345    directive_failed(sc, "rtems_partition_create");
346  }
347  rtems_resource_snapshot_take(&snapshot);
348  rtems_test_assert(
349    snapshot.rtems_api.active_partitions == CONFIGURE_MAXIMUM_PARTITIONS
350  );
351#endif
352
353#ifdef CONFIGURE_MAXIMUM_PERIODS
354  for (i = 0; i < CONFIGURE_MAXIMUM_PERIODS; ++i) {
355    sc = rtems_rate_monotonic_create(name, &id);
356    directive_failed(sc, "rtems_rate_monotonic_create");
357  }
358  rtems_resource_snapshot_take(&snapshot);
359  rtems_test_assert(
360    snapshot.rtems_api.active_periods == CONFIGURE_MAXIMUM_PERIODS
361  );
362#endif
363
364#ifdef CONFIGURE_MAXIMUM_REGIONS
365  for (i = 0; i < CONFIGURE_MAXIMUM_REGIONS; ++i) {
366    sc = rtems_region_create(
367      name,
368      region_areas + i,
369      sizeof(region_areas [0]),
370      1,
371      RTEMS_DEFAULT_ATTRIBUTES,
372      &id
373    );
374    directive_failed(sc, "rtems_region_create");
375  }
376  rtems_resource_snapshot_take(&snapshot);
377  rtems_test_assert(
378    snapshot.rtems_api.active_regions == CONFIGURE_MAXIMUM_REGIONS
379  );
380#endif
381
382#ifdef CONFIGURE_MAXIMUM_SEMAPHORES
383  for (i = 0; i < CONFIGURE_MAXIMUM_SEMAPHORES; ++i) {
384    sc = rtems_semaphore_create(
385      name,
386      0,
387      RTEMS_DEFAULT_ATTRIBUTES,
388      0,
389      &id
390    );
391    directive_failed(sc, "rtems_semaphore_create");
392  }
393  rtems_resource_snapshot_take(&snapshot);
394  rtems_test_assert(
395    snapshot.rtems_api.active_semaphores >= CONFIGURE_MAXIMUM_SEMAPHORES
396  );
397#endif
398
399#ifdef CONFIGURE_MAXIMUM_TASKS
400  for (i = 1; i < CONFIGURE_MAXIMUM_TASKS; ++i) {
401    sc = rtems_task_create(
402      name,
403      RTEMS_MINIMUM_PRIORITY,
404      RTEMS_MINIMUM_STACK_SIZE,
405      RTEMS_DEFAULT_MODES,
406      RTEMS_LOCAL | RTEMS_FLOATING_POINT,
407      &id
408    );
409    directive_failed(sc, "rtems_task_create");
410  }
411  rtems_resource_snapshot_take(&snapshot);
412  rtems_test_assert(
413    snapshot.rtems_api.active_tasks == CONFIGURE_MAXIMUM_TASKS
414  );
415#endif
416
417#ifdef CONFIGURE_MAXIMUM_TIMERS
418  for (i = 0; i < CONFIGURE_MAXIMUM_TIMERS; ++i) {
419    sc = rtems_timer_create(name, &id);
420    directive_failed(sc, "rtems_timer_create");
421  }
422  rtems_resource_snapshot_take(&snapshot);
423  rtems_test_assert(
424    snapshot.rtems_api.active_timers == CONFIGURE_MAXIMUM_TIMERS
425  );
426#endif
427
428#ifdef POSIX_MQ_COUNT
429  for (i = 0; i < POSIX_MQ_COUNT; ++i) {
430    int oflag = O_RDWR | O_CREAT | O_EXCL;
431    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
432    struct mq_attr attr = {
433      .mq_maxmsg = posix_mq_counts [i],
434      .mq_msgsize = posix_mq_sizes [i]
435    };
436    char *path = get_posix_name('M', 'S', 'Q', i);
437    mqd_t mq = mq_open(path, oflag, mode, &attr);
438    rtems_test_assert(mq >= 0);
439  }
440  rtems_resource_snapshot_take(&snapshot);
441  rtems_test_assert(
442    snapshot.posix_api.active_message_queues
443      == CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
444  );
445#endif
446
447#ifdef CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
448  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_SEMAPHORES; ++i) {
449    int oflag = O_RDWR | O_CREAT | O_EXCL;
450    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
451    unsigned int value = 0;
452    char *path = get_posix_name('S', 'E', 'M', i);
453    sem_t *sem = sem_open(path, oflag, mode, value);
454    rtems_test_assert(sem != SEM_FAILED);
455  }
456  rtems_resource_snapshot_take(&snapshot);
457  rtems_test_assert(
458    snapshot.posix_api.active_semaphores == CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
459  );
460#endif
461
462#ifdef CONFIGURE_MAXIMUM_POSIX_THREADS
463  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_THREADS; ++i) {
464    pthread_t thread;
465    eno = pthread_create(&thread, NULL, posix_thread, NULL);
466    rtems_test_assert(eno == 0);
467  }
468  rtems_resource_snapshot_take(&snapshot);
469  rtems_test_assert(
470    snapshot.posix_api.active_threads == CONFIGURE_MAXIMUM_POSIX_THREADS
471  );
472#endif
473
474#ifdef CONFIGURE_MAXIMUM_POSIX_TIMERS
475  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_TIMERS; ++i) {
476    timer_t timer_id;
477    rv = timer_create(CLOCK_REALTIME, NULL, &timer_id);
478    rtems_test_assert(rv == 0);
479  }
480  rtems_resource_snapshot_take(&snapshot);
481  rtems_test_assert(
482    snapshot.posix_api.active_timers == CONFIGURE_MAXIMUM_POSIX_TIMERS
483  );
484#endif
485
486  printf("object creation done\n");
487  print_info();
488
489  TEST_END();
490
491  rtems_test_exit(0);
492}
Note: See TracBrowser for help on using the repository browser.