source: rtems/testsuites/psxtests/psxconfig01/init.c @ fd27bae

5
Last change on this file since fd27bae was fd27bae, checked in by Sebastian Huber <sebastian.huber@…>, on 08/07/18 at 04:25:47

CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE

Make CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE configurable by the user.

Update #3434.

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