]>
git.saurik.com Git - apple/xnu.git/blob - tools/tests/xnu_quick_test/sema_tests.c
5 * Created by Jerry Cottingham on 6/2/2005.
6 * Copyright 2005 Apple Computer Inc. All rights reserved.
12 #include <semaphore.h>
14 /* **************************************************************************************************************
15 * Test semctl, semget, semop system calls.
16 * **************************************************************************************************************
18 int sema_tests( void * the_argp
)
20 #if !TARGET_OS_EMBEDDED
23 union semun my_sem_union
;
24 struct sembuf my_sembuf
;
26 srand( (unsigned int)getpid() );
27 my_sem_id
= semget( (key_t
)1234, 1, (0666 | IPC_CREAT
) );
28 if ( my_sem_id
== -1 ) {
29 printf( "semget failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
30 goto test_failed_exit
;
34 my_err
= semctl( my_sem_id
, 0, SETVAL
, my_sem_union
);
35 if ( my_sem_id
== -1 ) {
36 printf( "semget failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
37 goto test_failed_exit
;
40 /* verify semop failure for bad nsop values */
41 my_err
= semop( my_sem_id
, &my_sembuf
, 10000);
42 if (my_err
!= -1 || errno
!= E2BIG
) {
43 printf( "semop did not fail with E2BIG - instead %d - \"%s\" \n", errno
, strerror( errno
) );
44 goto test_failed_exit
;
48 for ( i
= 0; i
< 10000; i
++ ) {
49 my_sembuf
.sem_num
= 0;
50 my_sembuf
.sem_op
= -1;
51 my_sembuf
.sem_flg
= SEM_UNDO
;
53 my_err
= semop( my_sem_id
, &my_sembuf
, 1 );
55 printf( "semop failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
56 goto test_failed_exit
;
59 my_err
= semctl( my_sem_id
, 0, GETVAL
, 0 );
61 printf( "semctl failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
62 goto test_failed_exit
;
65 printf( "semctl(getval) returned %d. it should be 0 (locked) here \n", my_err
);
66 goto test_failed_exit
;
69 my_sembuf
.sem_num
= 0;
71 my_sembuf
.sem_flg
= SEM_UNDO
;
73 my_err
= semop( my_sem_id
, &my_sembuf
, 1 );
75 printf( "semop failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
76 goto test_failed_exit
;
80 my_err
= semctl( my_sem_id
, 0, IPC_RMID
, my_sem_union
);
82 printf( "semctl (IPC_RMID) failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
83 goto test_failed_exit
;
87 goto test_passed_exit
;
93 if ( my_sem_id
!= -1 ) {
94 semctl( my_sem_id
, 0, IPC_RMID
, my_sem_union
);
98 printf( "\t--> Not supported on EMBEDDED TARGET\n" );
104 /* **************************************************************************************************************
105 * Test sem_close, sem_open, sem_post, sem_trywait, sem_unlink, sem_wait system calls.
106 * **************************************************************************************************************
108 int sema2_tests( void * the_argp
)
111 sem_t
* my_sem_t
= (sem_t
*)SEM_FAILED
;
112 char my_sema_name
[ 64 ];
114 /* get a semaphore (initialized as locked) */
115 sprintf( &my_sema_name
[0], "sema_testing_%d", getpid( ) );
116 my_sem_t
= sem_open( &my_sema_name
[0], (O_CREAT
| O_EXCL
), (S_IRUSR
| S_IWUSR
), 0 );
117 if ( my_sem_t
== (sem_t
*)SEM_FAILED
) {
118 printf( "sem_open failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
119 goto test_failed_exit
;
122 /* get the lock - should return EAGAIN (EWOULDBLOCK) */
123 my_err
= sem_trywait( my_sem_t
);
124 if ( my_err
== -1 ) {
126 if ( my_err
!= EAGAIN
) {
127 printf( "sem_trywait failed with error %d - \"%s\" \n", my_err
, strerror( my_err
) );
128 goto test_failed_exit
;
132 /* unlock our semaphore */
133 my_err
= sem_post( my_sem_t
);
134 if ( my_err
== -1 ) {
135 printf( "sem_post failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
136 goto test_failed_exit
;
139 /* get the lock again */
140 my_err
= sem_wait( my_sem_t
);
141 if ( my_err
== -1 ) {
142 printf( "sem_wait failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
143 goto test_failed_exit
;
146 my_err
= sem_unlink( &my_sema_name
[0] );
147 if ( my_err
== -1 ) {
148 printf( "sem_unlink failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
149 goto test_failed_exit
;
152 my_err
= sem_close( my_sem_t
);
153 if ( my_err
== -1 ) {
154 printf( "sem_close failed with error %d - \"%s\" \n", errno
, strerror( errno
) );
155 goto test_failed_exit
;
157 my_sem_t
= (sem_t
*)SEM_FAILED
;
160 goto test_passed_exit
;
166 if ( my_sem_t
!= (sem_t
*)SEM_FAILED
) {
167 sem_close( my_sem_t
);