source: rtems/testsuites/psxtests/psxsem01/init.c

Last change on this file was 5594854, checked in by Joel Sherrill <joel@…>, on 04/07/22 at 15:05:28

testsuites/psxtests/psx[n-z]*: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 18.3 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 *  COPYRIGHT (c) 1989-2012.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <sched.h>
34#include <semaphore.h>
35#include <errno.h>
36#include <fcntl.h>
37#include <limits.h>
38#include <time.h>
39#include <tmacros.h>
40#include <pmacros.h>
41#include "test_support.h"
42
43const char rtems_test_name[] = "PSXSEM 1";
44
45/* forward declarations to avoid warnings */
46void *POSIX_Init(void *argument);
47
48#define MAX_SEMS  10
49
50static void *sem_wait_task(void *arg)
51{
52  sem_t *sem;
53  int    rv;
54
55  sem = arg;
56
57  rv = sem_wait( sem );
58  rtems_test_assert( rv == 0 );
59
60  rv = sem_wait( sem );
61  rtems_test_assert( rv == 0 );
62
63  return NULL;
64}
65
66static void test_sem_wait_during_delete(void)
67{
68  sem_t     sem;
69  int       rv;
70  pthread_t th;
71  int       eno;
72  int       val;
73
74  rv = sem_init( &sem, 0, 1 );
75  rtems_test_assert( rv == 0 );
76
77  eno = pthread_create( &th, NULL, sem_wait_task, &sem );
78  rtems_test_assert( eno == 0 );
79
80  rv = sem_getvalue( &sem, &val );
81  rtems_test_assert( rv == 0 );
82  rtems_test_assert( val == 1 );
83
84  sched_yield();
85
86  rv = sem_getvalue( &sem, &val );
87  rtems_test_assert( rv == 0 );
88  rtems_test_assert( val == 0 );
89
90  errno = 0;
91  rv = sem_destroy( &sem );
92  rtems_test_assert( rv == -1 );
93  rtems_test_assert( errno == EBUSY );
94
95  rv = sem_post( &sem );
96  rtems_test_assert( rv == 0 );
97
98  eno = pthread_join( th, NULL );
99  rtems_test_assert( eno == 0 );
100
101  rv = sem_destroy( &sem );
102  rtems_test_assert( rv == 0 );
103}
104
105static void test_named_sem_wait_during_delete(void)
106{
107  sem_t     *sem;
108  sem_t     *sem2;
109  int        rv;
110  pthread_t  th;
111  int        eno;
112  int        val;
113
114  sem = sem_open( "sem", O_CREAT | O_EXCL, 0777, 1 );
115  rtems_test_assert( sem != SEM_FAILED );
116
117  sem2 = sem_open( "sem", 0 );
118  rtems_test_assert( sem2 != SEM_FAILED );
119  rtems_test_assert( sem == sem2 );
120
121  eno = pthread_create( &th, NULL, sem_wait_task, sem );
122  rtems_test_assert( eno == 0 );
123
124  rv = sem_getvalue( sem, &val );
125  rtems_test_assert( rv == 0 );
126  rtems_test_assert( val == 1 );
127
128  sched_yield();
129
130  rv = sem_getvalue( sem, &val );
131  rtems_test_assert( rv == 0 );
132  rtems_test_assert( val == 0 );
133
134  rv = sem_close( sem2 );
135  rtems_test_assert( rv == 0 );
136
137  errno = 0;
138  rv = sem_close( sem );
139  rtems_test_assert( rv == -1 );
140  rtems_test_assert( errno == EBUSY );
141
142  rv = sem_post( sem );
143  rtems_test_assert( rv == 0 );
144
145  eno = pthread_join( th, NULL );
146  rtems_test_assert( eno == 0 );
147
148  rv = sem_close( sem );
149  rtems_test_assert( rv == 0 );
150
151  rv = sem_unlink( "sem" );
152  rtems_test_assert( rv == 0 );
153}
154
155static void test_sem_post_overflow(void)
156{
157  sem_t sem;
158  int   rv;
159  int   val;
160
161  rv = sem_init( &sem, 0, SEM_VALUE_MAX );
162  rtems_test_assert( rv == 0 );
163
164  rv = sem_getvalue( &sem, &val );
165  rtems_test_assert( rv == 0 );
166  rtems_test_assert( val == (int) SEM_VALUE_MAX );
167
168  errno = 0;
169  rv = sem_post( &sem );
170  rtems_test_assert( rv == -1 );
171  rtems_test_assert( errno == EOVERFLOW );
172
173  rv = sem_getvalue( &sem, &val );
174  rtems_test_assert( rv == 0 );
175  rtems_test_assert( val == (int) SEM_VALUE_MAX );
176
177  rv = sem_wait( &sem );
178  rtems_test_assert( rv == 0 );
179
180  rv = sem_post( &sem );
181  rtems_test_assert( rv == 0 );
182
183  rv = sem_destroy( &sem );
184  rtems_test_assert( rv == 0 );
185}
186
187static void test_sem_init_too_large_inital_value(void)
188{
189  sem_t  sem;
190  sem_t *sem2;
191  int    rv;
192
193  errno = 0;
194  rv = sem_init( &sem, 0, (unsigned int) SEM_VALUE_MAX + 1 );
195  rtems_test_assert( rv == -1 );
196  rtems_test_assert( errno == EINVAL );
197
198  errno = 0;
199  sem2 = sem_open(
200    "sem",
201    O_CREAT | O_EXCL,
202    0777,
203    (unsigned int) SEM_VALUE_MAX + 1
204  );
205  rtems_test_assert( sem2 == SEM_FAILED );
206  rtems_test_assert( errno == EINVAL );
207}
208
209static void test_sem_null(void)
210{
211  int rv;
212  int val;
213  struct timespec to;
214
215  /* This equality is important for POSIX_SEMAPHORE_VALIDATE_OBJECT() */
216  rtems_test_assert( NULL == SEM_FAILED );
217
218  errno = 0;
219  rv = sem_init( NULL, 0, 0 );
220  rtems_test_assert( rv == -1 );
221  rtems_test_assert( errno == EINVAL );
222
223  errno = 0;
224  rv = sem_wait( NULL );
225  rtems_test_assert( rv == -1 );
226  rtems_test_assert( errno == EINVAL );
227
228  errno = 0;
229  rv = sem_post( NULL );
230  rtems_test_assert( rv == -1 );
231  rtems_test_assert( errno == EINVAL );
232
233  errno = 0;
234  rv = sem_wait( NULL );
235  rtems_test_assert( rv == -1 );
236  rtems_test_assert( errno == EINVAL );
237
238  errno = 0;
239  rv = sem_trywait( NULL );
240  rtems_test_assert( rv == -1 );
241  rtems_test_assert( errno == EINVAL );
242
243  to.tv_sec = 1;
244  to.tv_nsec = 1;
245  errno = 0;
246  rv = sem_timedwait( NULL, &to );
247  rtems_test_assert( rv == -1 );
248  rtems_test_assert( errno == EINVAL );
249
250  errno = 0;
251  rv = sem_getvalue( NULL, &val );
252  rtems_test_assert( rv == -1 );
253  rtems_test_assert( errno == EINVAL );
254
255  errno = 0;
256  rv = sem_destroy( NULL );
257  rtems_test_assert( rv == -1 );
258  rtems_test_assert( errno == EINVAL );
259
260  errno = 0;
261  rv = sem_close( NULL );
262  rtems_test_assert( rv == -1 );
263  rtems_test_assert( errno == EINVAL );
264}
265
266static void test_sem_not_initialized(void)
267{
268  sem_t sem;
269  int rv;
270  int val;
271  struct timespec to;
272
273  memset( &sem, 0xff, sizeof( sem ) );
274
275  errno = 0;
276  rv = sem_wait( &sem );
277  rtems_test_assert( rv == -1 );
278  rtems_test_assert( errno == EINVAL );
279
280  errno = 0;
281  rv = sem_post( &sem );
282  rtems_test_assert( rv == -1 );
283  rtems_test_assert( errno == EINVAL );
284
285  errno = 0;
286  rv = sem_wait( &sem );
287  rtems_test_assert( rv == -1 );
288  rtems_test_assert( errno == EINVAL );
289
290  errno = 0;
291  rv = sem_trywait( &sem );
292  rtems_test_assert( rv == -1 );
293  rtems_test_assert( errno == EINVAL );
294
295  to.tv_sec = 1;
296  to.tv_nsec = 1;
297  errno = 0;
298  rv = sem_timedwait( &sem, &to );
299  rtems_test_assert( rv == -1 );
300  rtems_test_assert( errno == EINVAL );
301
302  errno = 0;
303  rv = sem_getvalue( &sem, &val );
304  rtems_test_assert( rv == -1 );
305  rtems_test_assert( errno == EINVAL );
306
307  errno = 0;
308  rv = sem_destroy( &sem );
309  rtems_test_assert( rv == -1 );
310  rtems_test_assert( errno == EINVAL );
311
312  errno = 0;
313  rv = sem_close( &sem );
314  rtems_test_assert( rv == -1 );
315  rtems_test_assert( errno == EINVAL );
316}
317
318static void test_sem_invalid_copy(void)
319{
320  sem_t sem;
321  sem_t sem2;
322  int   rv;
323  int   val;
324
325  rv = sem_init( &sem, 0, 0 );
326  rtems_test_assert( rv == 0 );
327
328  val = 1;
329  rv = sem_getvalue( &sem, &val );
330  rtems_test_assert( rv == 0 );
331  rtems_test_assert( val == 0 );
332
333  memcpy( &sem2, &sem, sizeof( sem2 ) );
334
335  errno = 0;
336  rv = sem_getvalue( &sem2, &val );
337  rtems_test_assert( rv == -1 );
338  rtems_test_assert( errno == EINVAL );
339
340  rv = sem_destroy( &sem );
341  rtems_test_assert( rv == 0 );
342
343  errno = 0;
344  rv = sem_getvalue( &sem, &val );
345  rtems_test_assert( rv == -1 );
346  rtems_test_assert( errno == EINVAL );
347}
348
349void *POSIX_Init(
350  void *argument
351)
352{
353  int             status;
354  int             value;
355  int             i;
356  sem_t           sems[MAX_SEMS];
357  sem_t           sem2;
358  sem_t           *n_sem1;
359  sem_t           *n_sem2;
360  struct timespec waittime;
361  char            failure_msg[80];
362
363  TEST_BEGIN();
364
365  puts( "Init: sem_init - SUCCESSFUL" );
366  status = sem_init(&sem2, 1, 1);
367  fatal_posix_service_status( status, 0, "sem_init with pshared != 0");
368
369  puts( "Init: sem_destroy - SUCCESSFUL" );
370  status = sem_destroy(&sem2);
371  fatal_posix_service_status( status, 0, "sem_destroy");
372
373  puts( "Init: sem_init - UNSUCCESSFUL (EINVAL)" );
374  status = sem_init(NULL, 0, 1);
375  fatal_posix_service_status( status, -1, "sem_init error return status");
376  fatal_posix_service_status( errno, EINVAL, "sem_init errorno EINVAL" );
377
378  puts( "Init: sem_init - SUCCESSFUL" );
379  for (i = 0; i < MAX_SEMS; i++) {
380    status = sem_init(&sems[i], 0, i);
381    sprintf(failure_msg, "sem_init %d", i );
382    fatal_posix_service_status( status, 0, failure_msg);
383  }
384
385  puts( "Init: sem_init - SUCCESSFUL" );
386  status = sem_init(&sem2, 0, 1);
387  fatal_posix_service_status( status, 0, "sem_init");
388
389  puts( "Init: sem_destroy - SUCCESSFUL" );
390  status = sem_destroy(&sem2);
391  fatal_posix_service_status( status, 0, "sem_destroy");
392
393  puts( "Init: sem_getvalue - SUCCESSFUL ");
394  for (i = 0; i < MAX_SEMS; i++) {
395    status = sem_getvalue(&sems[i], &value);
396    sprintf( failure_msg, "sem_getvalue %d", i );
397    fatal_posix_service_status( status, 0, failure_msg );
398    fatal_posix_service_status( value, i, "sem_getvalue correct value" );
399  }
400  puts( "Init: sem_getvalue - UNSUCCESSFUL ");
401  status = sem_getvalue(SEM_FAILED, &value);
402  fatal_posix_service_status( status, -1, "sem_getvalue error return status");
403  fatal_posix_service_status( errno, EINVAL, "sem_getvalue errno EINVAL");
404
405  puts( "Init: sem_destroy - SUCCESSFUL" );
406  status = sem_destroy(&sems[0]);
407  fatal_posix_service_status( status, 0, "sem_destroy semaphore 0");
408
409  puts( "Init: sem_destroy - UNSUCCESSFUL (EINVAL)" );
410  status = sem_destroy(SEM_FAILED);
411  fatal_posix_service_status( status, -1, "sem_destroy error return status");
412  fatal_posix_service_status( errno, EINVAL, "sem_destroy errno EINVAL");
413
414  puts( "Init: sem_wait - SUCCESSFUL" );
415  status = sem_wait(&sems[1]);
416  fatal_posix_service_status( status, 0, "sem_wait semaphore 1");
417  /* sem[1].count = 0 */
418
419  puts( "Init: sem_wait - UNSUCCESSFUL (EINVAL)" );
420  status = sem_wait(SEM_FAILED);
421  fatal_posix_service_status( status, -1, "sem_wait error return status");
422  fatal_posix_service_status( errno, EINVAL, "sem_wait errno EINVAL");
423
424  puts( "Init: sem_post - SUCCESSFUL" );
425  status = sem_post(&sems[1]);
426  fatal_posix_service_status( status, 0, "sem_post semaphore 1");
427  /* sem[1].count = 1 */
428
429  puts( "Init: sem_wait - SUCCESSFUL (after a sem_post)" );
430  status = sem_wait(&sems[1]);
431  fatal_posix_service_status( status, 0, "sem_wait semaphore 1");
432  /* sem[1].count = 0 */
433
434  puts( "Init: sem_trywait - SUCCESSFUL" );
435  status = sem_trywait(&sems[2]);
436  fatal_posix_service_status( status, 0, "sem_trywait semaphore 2");
437  /* sem[2].count = 1 */
438
439  puts( "Init: sem_trywait - UNSUCCESSFUL (EAGAIN)" );
440  status = sem_trywait(&sems[1]);
441  fatal_posix_service_status( status, -1, "sem_trywait error return status");
442  fatal_posix_service_status( errno, EAGAIN, "sem_trywait errno EAGAIN");
443  /* sem[1].count = 0 */
444
445  puts( "Init: sem_trywait - UNSUCCESSFUL (EINVAL)" );
446  status = sem_trywait(SEM_FAILED);
447  fatal_posix_service_status( status, -1, "sem_trywait error return status");
448  fatal_posix_service_status( errno, EINVAL, "sem_trywait errno EINVAL");
449
450#if 0
451  status = sem_post(&sems[2]);
452  fatal_posix_service_status( status, 0, "sem_post semaphore 2");
453  /* sem[2].count = 2 */
454#else
455  /* sem[2].count = 1 */
456#endif
457
458  puts( "Init: sem_timedwait - SUCCESSFUL" );
459  waittime.tv_sec = time(NULL) + 1;
460  waittime.tv_nsec = 100;
461  status = sem_timedwait(&sems[2], &waittime);
462  fatal_posix_service_status( status, 0, "sem_timedwait semaphore 2");
463  /* sem[2].count = 0 */
464
465  puts( "Init: sem_timedwait - UNSUCCESSFUL (ETIMEDOUT)" );
466  status = sem_timedwait(&sems[2], &waittime);
467  fatal_posix_service_status( status, -1, "sem_timedwait error return status");
468  fatal_posix_service_status(
469    errno, ETIMEDOUT, "sem_timedwait errno ETIMEDOUT");
470
471  /*
472   * To do this case, we must be blocking when we want the semaphore.
473   * POSIX doesn't want you to check the error if you can get the resource.
474   */
475
476#if 1
477  puts( "Init: sem_timedwait - UNSUCCESSFUL (EINVAL) -- skipping" );
478#else
479  puts( "Init: sem_timedwait - UNSUCCESSFUL (EINVAL)" );
480  waittime.tv_sec = 0;
481  waittime.tv_nsec = 0x7FFFFFFF;
482  status = sem_timedwait(&sems[2], &waittime);
483  fatal_posix_service_status( status, -1, "sem_timedwait error return status");
484  fatal_posix_service_status( errno, EINVAL, "sem_init errno EINVAL");
485#endif
486
487  puts( "Init: sem_post - UNSUCCESSFUL (EINVAL)" );
488  status = sem_post(SEM_FAILED);
489  fatal_posix_service_status( status, -1, "sem_post error return status");
490  fatal_posix_service_status( errno, EINVAL, "sem_post errno EINVAL");
491
492  puts( "Init: sem_destroy - SUCCESSFUL" );
493  for (i = 1; i < MAX_SEMS; i++) {
494    status = sem_destroy(&sems[i]);
495    sprintf( failure_msg, "sem_destroy %d", i );
496    fatal_posix_service_status( status, 0, failure_msg );
497  }
498
499  /* Modes are currently unsupported */
500
501  /*
502   * Validate all sem_open return paths.
503   */
504
505  puts( "Init: sem_open - UNSUCCESSFUL (ENAMETOOLONG)" );
506  n_sem1 = sem_open(Get_Too_Long_Name(), O_CREAT, 0777, 1 );
507  fatal_posix_sem( n_sem1, "sem_open error return status" );
508  fatal_posix_service_status(
509    errno, ENAMETOOLONG, "sem_open errorno ENAMETOOLONG" );
510
511  puts( "Init: sem_open - sem1 SUCCESSFUL" );
512  n_sem1 = sem_open( "sem1",O_CREAT, 0777, 1 );
513  rtems_test_assert( n_sem1 != SEM_FAILED );
514
515  puts( "Init: sem_destroy - named sem1 - EINVAL" );
516  status = sem_destroy(n_sem1);
517  fatal_posix_service_status( status, -1, "sem_destroy named semaphore");
518  fatal_posix_service_status( errno, EINVAL,  "sem_destroy named semaphore");
519
520  puts( "Init: sem_open - Create an Existing sem (EEXIST)" );
521  n_sem2 = sem_open("sem1", O_CREAT | O_EXCL, 0777, 1);
522  fatal_posix_sem( n_sem2, "sem_open error return status" );
523  fatal_posix_service_status( errno, EEXIST,  "sem_open errno EEXIST");
524
525  puts( "Init: sem_open - Open new sem without create flag (ENOENT)" );
526  n_sem2 = sem_open("sem3", O_EXCL, 0777, 1);
527  fatal_posix_sem( n_sem2, "sem_open error return status" );
528  fatal_posix_service_status( errno, ENOENT,  "sem_open errno EEXIST");
529
530  /*
531   * XXX - Could not hit the following errors:
532   *   E_POSIX_Semaphore_Create_support only fails if
533   *     ENOSYS - When semaphore is shared between processes.
534   *     ENOSPC - When out of memory.
535   */
536
537  /*
538   * Validate we can wait on a semaphore opened with sem_open.
539   */
540
541  puts( "Init: sem_wait on sem1" );
542  status = sem_wait(n_sem1);
543  fatal_posix_service_status( status, 0, "sem_wait opened semaphore");
544
545  /*
546   * Validate a second open returns the same semaphore.
547   */
548
549  puts( "Init: sem_open - Open an existing sem ( same id )" );
550  n_sem2 = sem_open("sem1", 0 );
551  rtems_test_assert( n_sem2 == n_sem1 );
552
553  /*
554   * Unlink the semaphore, then verify an open of the same name produces a
555   * different semaphore.
556   */
557
558  puts( "Init: sem_unlink - sem1 SUCCESSFUL" );
559  status = sem_unlink( "sem1" );
560  fatal_posix_service_status( status, 0, "sem_unlink locked semaphore");
561
562  puts( "Init: sem_open - Reopen sem1 SUCCESSFUL with a different id" );
563  n_sem2 = sem_open( "sem1", O_CREAT | O_EXCL, 0777, 1);
564  rtems_test_assert( n_sem2 != SEM_FAILED );
565  rtems_test_assert( n_sem2 != n_sem1 );
566
567  /*
568   * Validate we can call close on a semaphore opened with sem_open.
569   */
570
571  puts( "Init: sem_close (1) - SUCCESSFUL" );
572  status = sem_close( n_sem1 );
573  fatal_posix_service_status( status, 0, "sem_close semaphore");
574
575  /*
576   * Validate it n_sem2 (the last open for sem1 name can be
577   * correctly closed and unlinked.
578   */
579
580  puts( "Init: sem_close (2) - SUCCESSFUL" );
581  status = sem_close( n_sem2 );
582  fatal_posix_service_status( status, 0, "sem_close semaphore");
583
584  puts( "Init: sem_unlink - sem1 (2) SUCCESSFUL" );
585  status = sem_unlink( "sem1" );
586  fatal_posix_service_status( status, 0, "sem_unlink locked semaphore");
587
588  puts( "Init: sem_close - UNSUCCESSFUL (EINVAL)" );
589  status = sem_close(n_sem2);
590  fatal_posix_service_status( status, -1, "sem_close error return status");
591  fatal_posix_service_status( errno, EINVAL, "sem_close errno EINVAL");
592
593  puts( "Init: sem_unlink - UNSUCCESSFUL (ENOENT)" );
594  status = sem_unlink("sem1");
595  fatal_posix_service_status( status, -1, "sem_unlink error return status");
596  fatal_posix_service_status( errno, ENOENT, "sem_close errno EINVAL");
597
598
599  /*
600   * Validate we can unlink (2)
601   */
602
603  puts( "Init: sem_unlink (NULL) - EINVAL" );
604  status = sem_unlink( NULL );
605  fatal_posix_service_status( status, -1, "sem_unlink error return status");
606  fatal_posix_service_status( errno, EINVAL, "sem_unlink errno value");
607
608  puts( "Init: sem_unlink (\"\") - ENOENT" );
609  status = sem_unlink( "" );
610  fatal_posix_service_status( status, -1, "sem_unlink error return status");
611  fatal_posix_service_status( errno, ENOENT, "sem_unlink errno value");
612
613  /*
614   * XXX - Cant' create location OBJECTS_ERROR or OBJECTS_REMOTE.
615   *       sem_close and sem_unlink.
616   */
617
618  puts( "Init: sem_unlink - UNSUCCESSFUL (ENOENT)" );
619  status = sem_unlink("sem2");
620  fatal_posix_service_status( status, -1, "sem_unlink error return status");
621  fatal_posix_service_status( errno, ENOENT, "sem_unlink errno ENOENT");
622  rtems_test_assert( (status == -1) && (errno == ENOENT) );
623
624  test_named_sem_wait_during_delete();
625  test_sem_wait_during_delete();
626  test_sem_post_overflow();
627  test_sem_init_too_large_inital_value();
628  test_sem_null();
629  test_sem_not_initialized();
630  test_sem_invalid_copy();
631
632  /* Try adding in unlinking before closing... (can we still open?) */
633
634  TEST_END();
635  rtems_test_exit(0);
636
637  return NULL; /* just so the compiler thinks we returned something */
638}
639
640/* configuration information */
641#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
642#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
643
644#define CONFIGURE_POSIX_INIT_THREAD_TABLE
645
646#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
647
648#define CONFIGURE_MAXIMUM_POSIX_THREADS     2
649#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES  2
650
651#define CONFIGURE_POSIX_INIT_THREAD_TABLE
652#define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
653        (RTEMS_MINIMUM_STACK_SIZE * 4)
654
655#define CONFIGURE_INIT
656#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.