OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [tests/] [psxtests/] [psx03/] [init.c] - Blame information for rev 373

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 *  COPYRIGHT (c) 1989-1999.
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.OARcorp.com/rtems/license.html.
8
 *
9
 *  $Id: init.c,v 1.2 2001-09-27 12:02:23 chris Exp $
10
 */
11
 
12
#define CONFIGURE_INIT
13
#include "system.h"
14
#include <signal.h>
15
#include <errno.h>
16
 
17
volatile int Signal_occurred;
18
volatile int Signal_count;
19
 
20
void Signal_handler(
21
  int signo
22
)
23
{
24
  Signal_count++;
25
  printf(
26
    "Signal: %d caught by 0x%x (%d)\n",
27
    signo,
28
    pthread_self(),
29
    Signal_count
30
  );
31
  Signal_occurred = 1;
32
}
33
 
34
void *POSIX_Init(
35
  void *argument
36
)
37
{
38
  int               status;
39
  struct timespec   timeout;
40
  struct sigaction  act;
41
  sigset_t          mask;
42
  sigset_t          waitset;
43
  int               signo;
44
  siginfo_t         siginfo;
45
 
46
  puts( "\n\n*** POSIX TEST 3 ***" );
47
 
48
  /* set the time of day, and print our buffer in multiple ways */
49
 
50
  set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
51
 
52
  /* get id of this thread */
53
 
54
  Init_id = pthread_self();
55
  printf( "Init's ID is 0x%08x\n", Init_id );
56
 
57
  /* install a signal handler */
58
 
59
  status = sigemptyset( &act.sa_mask );
60
  assert( !status );
61
 
62
  act.sa_handler = Signal_handler;
63
  act.sa_flags   = 0;
64
 
65
  sigaction( SIGUSR1, &act, NULL );
66
 
67
  /* initialize signal handler variables */
68
 
69
  Signal_count = 0;
70
  Signal_occurred = 0;
71
 
72
  /*
73
   *  wait on SIGUSR1 for 3 seconds, will timeout
74
   */
75
 
76
  /* initialize the signal set we will wait for to SIGUSR1 */
77
 
78
  status = sigemptyset( &waitset );
79
  assert( !status );
80
 
81
  status = sigaddset( &waitset, SIGUSR1 );
82
  assert( !status );
83
 
84
  timeout.tv_sec = 3;
85
  timeout.tv_nsec = 0;
86
 
87
  puts( "Init: waiting on any signal for 3 seconds." );
88
  signo = sigtimedwait( &waitset, &siginfo, &timeout );
89
  assert( signo == -1 );
90
 
91
  if ( errno == EAGAIN )
92
    puts( "Init: correctly timed out waiting for SIGUSR1." );
93
  else
94
    printf( "sigtimedwait returned wrong errno - %d\n", errno );
95
 
96
  Signal_occurred = 0;
97
 
98
  /*
99
   *  wait on SIGUSR1 for 3 seconds, will timeout because Task_1 sends SIGUSR2
100
   */
101
 
102
  empty_line();
103
 
104
  /* initialize a mask to block SIGUSR2 */
105
 
106
  status = sigemptyset( &mask );
107
  assert( !status );
108
 
109
  status = sigaddset( &mask, SIGUSR2 );
110
  assert( !status );
111
 
112
  printf( "Init: Block SIGUSR2\n" );
113
  status = sigprocmask( SIG_BLOCK, &mask, NULL );
114
  assert( !status );
115
 
116
  /* create a thread */
117
 
118
  status = pthread_create( &Task_id, NULL, Task_1, NULL );
119
  assert( !status );
120
 
121
  /* signal handler is still installed, waitset is still set for SIGUSR1 */
122
 
123
  timeout.tv_sec = 3;
124
  timeout.tv_nsec = 0;
125
 
126
  puts( "Init: waiting on any signal for 3 seconds." );
127
  signo = sigtimedwait( &waitset, &siginfo, &timeout );
128
 
129
     /* switch to Task 1 */
130
 
131
  if ( errno == EAGAIN )
132
    puts( "Init: correctly timed out waiting for SIGUSR1." );
133
  else
134
    printf( "sigtimedwait returned wrong errno - %d\n", errno );
135
  assert( signo == -1 );
136
 
137
  /*
138
   *  wait on SIGUSR1 for 3 seconds, Task_2 will send it to us
139
   */
140
 
141
  empty_line();
142
 
143
  /* create a thread */
144
 
145
  status = pthread_create( &Task_id, NULL, Task_2, NULL );
146
  assert( !status );
147
 
148
  /* signal handler is still installed, waitset is still set for SIGUSR1 */
149
 
150
  /* wait on SIGUSR1 for 3 seconds, will receive SIGUSR1 from Task_2 */
151
 
152
  timeout.tv_sec = 3;
153
  timeout.tv_nsec = 0;
154
 
155
  /* just so we can check that these were altered */
156
 
157
  siginfo.si_code = -1;
158
  siginfo.si_signo = -1;
159
  siginfo.si_value.sival_int = -1;
160
 
161
  puts( "Init: waiting on any signal for 3 seconds." );
162
  signo = sigtimedwait( &waitset, &siginfo, &timeout );
163
  printf( "Init: received (%d) SIGUSR1=%d\n", siginfo.si_signo, SIGUSR1 );
164
  assert( signo == SIGUSR1 );
165
  assert( siginfo.si_signo == SIGUSR1 );
166
  assert( siginfo.si_code == SI_USER );
167
  assert( siginfo.si_value.sival_int != -1 );   /* rtems does always set this */
168
 
169
  /* try out a process signal */
170
 
171
  empty_line();
172
  puts( "Init: kill with SIGUSR2." );
173
  status = kill( getpid(), SIGUSR2 );
174
  assert( !status );
175
 
176
  siginfo.si_code = -1;
177
  siginfo.si_signo = -1;
178
  siginfo.si_value.sival_int = -1;
179
 
180
  status = sigemptyset( &waitset );
181
  assert( !status );
182
 
183
  status = sigaddset( &waitset, SIGUSR1 );
184
  assert( !status );
185
 
186
  status = sigaddset( &waitset, SIGUSR2 );
187
  assert( !status );
188
 
189
  puts( "Init: waiting on any signal for 3 seconds." );
190
  signo = sigtimedwait( &waitset, &siginfo, &timeout );
191
  printf( "Init: received (%d) SIGUSR2=%d\n", siginfo.si_signo, SIGUSR2 );
192
  assert( signo == SIGUSR2 );
193
  assert( siginfo.si_signo == SIGUSR2 );
194
  assert( siginfo.si_code == SI_USER );
195
  assert( siginfo.si_value.sival_int != -1 );   /* rtems does always set this */
196
 
197
  /* exit this thread */
198
 
199
  puts( "*** END OF POSIX TEST 3 ***" );
200
  exit( 0 );
201
 
202
  return NULL; /* just so the compiler thinks we returned something */
203
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.