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

4.115
Last change on this file since cafefbf was cafefbf, checked in by Ralf Corsepius <ralf.corsepius@…>, on 02/22/11 at 09:47:36

Add HAVE_CONFIG_H.

  • Property mode set to 100644
File size: 10.7 KB
Line 
1/*
2 *  COPYRIGHT (c) 1989-2009.
3 *  On-Line Applications Research Corporation (OAR).
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.com/license/LICENSE.
8 *
9 *  $Id$
10 */
11
12#ifdef HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16#include <sched.h>
17#include <semaphore.h>
18#include <errno.h>
19#include <fcntl.h>
20#include <time.h>
21#include <tmacros.h>
22#include <pmacros.h>
23#include "test_support.h"
24
25#define MAX_SEMS  10
26
27void *POSIX_Init(
28  void *argument
29)
30{
31  int             status;
32  int             value;
33  int             i;
34  sem_t           sems[MAX_SEMS];
35  sem_t           sem2;
36  sem_t           *n_sem1;
37  sem_t           *n_sem2;
38  struct timespec waittime;
39  char            failure_msg[80];
40
41  puts( "\n\n*** POSIX SEMAPHORE MANAGER TEST 1 ***" );
42
43  puts( "Init: sem_init - UNSUCCESSFUL (EINVAL)" );
44  status = sem_init(NULL, 0, 1);
45  fatal_posix_service_status( status, -1, "sem_init error return status");
46  fatal_posix_service_status( errno, EINVAL, "sem_init errorno EINVAL" );
47
48  puts( "Init: sem_init - SUCCESSFUL" );
49  for (i = 0; i < MAX_SEMS; i++) {
50    status = sem_init(&sems[i], 0, i);
51    sprintf(failure_msg, "sem_init %d", i );
52    fatal_posix_service_status( status, 0, failure_msg);
53  }
54  puts( "Init: sem_init - UNSUCCESSFUL (ENOSPC)" );
55  status = sem_init(&sem2, 0, 1);
56  fatal_posix_service_status( status, -1, "sem_init error return status");
57  fatal_posix_service_status( errno, ENOSPC, "sem_init errorno ENOSPC" );
58
59  puts( "Init: sem_init - UNSUCCESSFUL (ENOSYS -- pshared not supported)" );
60  status = sem_init(&sem2, 1, 1);
61  fatal_posix_service_status( status, -1, "sem_init error return status");
62  fatal_posix_service_status( errno, ENOSYS, "sem_init errno set to ENOSYS");
63
64  puts( "Init: sem_getvalue - SUCCESSFUL ");
65  for (i = 0; i < MAX_SEMS; i++) {
66    status = sem_getvalue(&sems[i], &value);
67    sprintf( failure_msg, "sem_getvalue %d", i );
68    fatal_posix_service_status( status, 0, failure_msg );
69    fatal_posix_service_status( value, i, "sem_getvalue correct value" );
70  }
71  puts( "Init: sem_getvalue - UNSUCCESSFUL ");
72  status = sem_getvalue(&sem2, &value);
73  fatal_posix_service_status( status, -1, "sem_getvalue error return status");
74  fatal_posix_service_status( errno, EINVAL, "sem_getvalue errno EINVAL");
75
76  puts( "Init: sem_destroy - SUCCESSFUL" );
77  status = sem_destroy(&sems[0]);
78  fatal_posix_service_status( status, 0, "sem_destroy semaphore 0");
79
80  puts( "Init: sem_destroy - UNSUCCESSFUL (EINVAL)" );
81  status = sem_destroy(&sem2);
82  fatal_posix_service_status( status, -1, "sem_destroy error return status");
83  fatal_posix_service_status( errno, EINVAL, "sem_destroy errno EINVAL");
84
85  puts( "Init: sem_wait - SUCCESSFUL" );
86  status = sem_wait(&sems[1]);
87  fatal_posix_service_status( status, 0, "sem_wait semaphore 1");
88  /* sem[1].count = 0 */
89
90  puts( "Init: sem_wait - UNSUCCESSFUL (EINVAL)" );
91  status = sem_wait(&sem2);
92  fatal_posix_service_status( status, -1, "sem_wait error return status");
93  fatal_posix_service_status( errno, EINVAL, "sem_wait errno EINVAL");
94
95  puts( "Init: sem_post - SUCCESSFUL" );
96  status = sem_post(&sems[1]);
97  fatal_posix_service_status( status, 0, "sem_post semaphore 1");
98  /* sem[1].count = 1 */
99
100  puts( "Init: sem_wait - SUCCESSFUL (after a sem_post)" );
101  status = sem_wait(&sems[1]);
102  fatal_posix_service_status( status, 0, "sem_wait semaphore 1");
103  /* sem[1].count = 0 */
104
105  puts( "Init: sem_trywait - SUCCESSFUL" );
106  status = sem_trywait(&sems[2]);
107  fatal_posix_service_status( status, 0, "sem_trywait semaphore 2");
108  /* sem[2].count = 1 */
109
110  puts( "Init: sem_trywait - UNSUCCESSFUL (EAGAIN)" );
111  status = sem_trywait(&sems[1]);
112  fatal_posix_service_status( status, -1, "sem_trywait error return status");
113  fatal_posix_service_status( errno, EAGAIN, "sem_trywait errno EAGAIN");
114  /* sem[1].count = 0 */
115
116  puts( "Init: sem_trywait - UNSUCCESSFUL (EINVAL)" );
117  status = sem_trywait(&sem2);
118  fatal_posix_service_status( status, -1, "sem_trywait error return status");
119  fatal_posix_service_status( errno, EINVAL, "sem_trywait errno EINVAL");
120
121#if 0
122  status = sem_post(&sems[2]);
123  fatal_posix_service_status( status, 0, "sem_post semaphore 2");
124  /* sem[2].count = 2 */
125#else
126  /* sem[2].count = 1 */
127#endif
128
129  puts( "Init: sem_timedwait - SUCCESSFUL" );
130  waittime.tv_sec = time(NULL) + 1;
131  waittime.tv_nsec = 100;
132  status = sem_timedwait(&sems[2], &waittime);
133  fatal_posix_service_status( status, 0, "sem_timedwait semaphore 2");
134  /* sem[2].count = 0 */
135
136  puts( "Init: sem_timedwait - UNSUCCESSFUL (ETIMEDOUT)" );
137  status = sem_timedwait(&sems[2], &waittime);
138  fatal_posix_service_status( status, -1, "sem_timedwait error return status");
139  fatal_posix_service_status(
140    errno, ETIMEDOUT, "sem_timedwait errno ETIMEDOUT");
141
142  /*
143   * To do this case, we must be blocking when we want the semaphore.
144   * POSIX doesn't want you to check the error if you can get the resource.
145   */
146
147#if 1
148  puts( "Init: sem_timedwait - UNSUCCESSFUL (EINVAL) -- skipping" );
149#else
150  puts( "Init: sem_timedwait - UNSUCCESSFUL (EINVAL)" );
151  waittime.tv_sec = 0;
152  waittime.tv_nsec = 0x7FFFFFFF;
153  status = sem_timedwait(&sems[2], &waittime);
154  fatal_posix_service_status( status, -1, "sem_timedwait error return status");
155  fatal_posix_service_status( errno, EINVAL, "sem_init errno EINVAL");
156#endif
157
158  puts( "Init: sem_post - UNSUCCESSFUL (EINVAL)" );
159  status = sem_post(&sem2);
160  fatal_posix_service_status( status, -1, "sem_post error return status");
161  fatal_posix_service_status( errno, EINVAL, "sem_post errno EINVAL");
162
163  puts( "Init: sem_destroy - SUCCESSFUL" );
164  for (i = 1; i < MAX_SEMS; i++) {
165    status = sem_destroy(&sems[i]);
166    sprintf( failure_msg, "sem_destroy %d", i );
167    fatal_posix_service_status( status, 0, failure_msg );
168  }
169
170  /* Modes are currently unsupported */
171
172  /*
173   * Validate all sem_open return paths.
174   */
175
176  puts( "Init: sem_open - UNSUCCESSFUL (ENAMETOOLONG)" );
177  n_sem1 = sem_open(Get_Too_Long_Name(), O_CREAT, 0777, 1 );
178  fatal_posix_service_pointer_minus_one(
179    n_sem1, "sem_open error return status");
180  fatal_posix_service_status(
181    errno, ENAMETOOLONG, "sem_open errorno ENAMETOOLONG" );
182
183  puts( "Init: sem_open - sem1 SUCCESSFUL" );
184  n_sem1 = sem_open( "sem1",O_CREAT, 0777, 1 );
185  rtems_test_assert( n_sem1 != SEM_FAILED );
186
187  puts( "Init: sem_destroy - named sem1 - EINVAL" );
188  status = sem_destroy(n_sem1);
189  fatal_posix_service_status( status, -1, "sem_destroy named semaphore");
190  fatal_posix_service_status( errno, EINVAL,  "sem_destroy named semaphore");
191
192  puts( "Init: sem_open - Create an Existing sem (EEXIST)" );
193  n_sem2 = sem_open("sem1", O_CREAT | O_EXCL, 0777, 1);
194  fatal_posix_service_pointer_minus_one(
195    n_sem2, "sem_open error return status" );
196  fatal_posix_service_status( errno, EEXIST,  "sem_open errno EEXIST");
197
198  puts( "Init: sem_open - Open new sem without create flag (ENOENT)" );
199  n_sem2 = sem_open("sem3", O_EXCL, 0777, 1);
200  fatal_posix_service_pointer_minus_one(
201    n_sem2, "sem_open error return status" );
202  fatal_posix_service_status( errno, ENOENT,  "sem_open errno EEXIST");
203
204  /*
205   * XXX - Could not hit the following errors:
206   *   E_POSIX_Semaphore_Create_support only fails if
207   *     ENOSYS - When semaphore is shared between processes.
208   *     ENOSPC - When out of memory.
209   */
210
211  /*
212   * Validate we can wait on a semaphore opened with sem_open.
213   */
214
215  puts( "Init: sem_wait on sem1" );
216  status = sem_wait(n_sem1);
217  fatal_posix_service_status( status, 0, "sem_wait opened semaphore");
218
219  /*
220   * Validate a second open returns the same semaphore.
221   */
222
223  puts( "Init: sem_open - Open an existing sem ( same id )" );
224  n_sem2 = sem_open("sem1", 0 );
225  rtems_test_assert( n_sem2 == n_sem1 );
226
227  /*
228   * Unlink the semaphore, then verify an open of the same name produces a
229   * different semaphore.
230   */
231
232  puts( "Init: sem_unlink - sem1 SUCCESSFUL" );
233  status = sem_unlink( "sem1" );
234  fatal_posix_service_status( status, 0, "sem_unlink locked semaphore");
235
236  puts( "Init: sem_open - Reopen sem1 SUCCESSFUL with a different id" );
237  n_sem2 = sem_open( "sem1", O_CREAT | O_EXCL, 0777, 1);
238  rtems_test_assert( n_sem2 != SEM_FAILED );
239  rtems_test_assert( n_sem2 != n_sem1 );
240
241  /*
242   * Validate we can call close on a semaphore opened with sem_open.
243   */
244
245  puts( "Init: sem_close (1) - SUCCESSFUL" );
246  status = sem_close( n_sem1 );
247  fatal_posix_service_status( status, 0, "sem_close semaphore");
248
249  /*
250   * Validate it n_sem2 (the last open for sem1 name can be
251   * correctly closed and unlinked.
252   */
253
254  puts( "Init: sem_close (2) - SUCCESSFUL" );
255  status = sem_close( n_sem2 );
256  fatal_posix_service_status( status, 0, "sem_close semaphore");
257
258  puts( "Init: sem_unlink - sem1 (2) SUCCESSFUL" );
259  status = sem_unlink( "sem1" );
260  fatal_posix_service_status( status, 0, "sem_unlink locked semaphore");
261
262  puts( "Init: sem_close - UNSUCCESSFUL (EINVAL)" );
263  status = sem_close(n_sem2);
264  fatal_posix_service_status( status, -1, "sem_close error return status");
265  fatal_posix_service_status( errno, EINVAL, "sem_close errno EINVAL");
266
267  puts( "Init: sem_unlink - UNSUCCESSFUL (ENOENT)" );
268  status = sem_unlink("sem1");
269  fatal_posix_service_status( status, -1, "sem_unlink error return status");
270  fatal_posix_service_status( errno, ENOENT, "sem_close errno EINVAL");
271
272
273  /*
274   * Validate we can unlink (2)
275   */
276
277  puts( "Init: sem_unlink (NULL) - EINVAL" );
278  status = sem_unlink( NULL );
279  fatal_posix_service_status( status, -1, "sem_unlink error return status");
280  fatal_posix_service_status( errno, EINVAL, "sem_unlink errno value");
281
282  puts( "Init: sem_unlink (\"\") - EINVAL" );
283  status = sem_unlink( "" );
284  fatal_posix_service_status( status, -1, "sem_unlink error return status");
285  fatal_posix_service_status( errno, EINVAL, "sem_unlink errno value");
286
287  /*
288   * XXX - Cant' create location OBJECTS_ERROR or OBJECTS_REMOTE.
289   *       sem_close and sem_unlink.
290   */
291
292  puts( "Init: sem_unlink - UNSUCCESSFUL (ENOENT)" );
293  status = sem_unlink("sem2");
294  fatal_posix_service_status( status, -1, "sem_unlink error return status");
295  fatal_posix_service_status( errno, ENOENT, "sem_unlink errno ENOENT");
296  rtems_test_assert( (status == -1) && (errno == ENOENT) );
297
298
299  /* Try adding in unlinking before closing... (can we still open?) */
300
301  puts( "*** END OF POSIX SEMAPHORE MANAGER TEST 1 ***" );
302  rtems_test_exit(0);
303
304  return NULL; /* just so the compiler thinks we returned something */
305}
306
307/* configuration information */
308#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
309#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
310
311#define CONFIGURE_POSIX_INIT_THREAD_TABLE
312
313#define CONFIGURE_MAXIMUM_POSIX_THREADS     1
314#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES  MAX_SEMS
315
316#define CONFIGURE_POSIX_INIT_THREAD_TABLE
317#define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
318        (RTEMS_MINIMUM_STACK_SIZE * 4)
319
320#define CONFIGURE_INIT
321#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.