Posix signal occurs during interruptible sleep ?
Jie Liu
lj8175 at gmail.com
Mon May 30 15:52:49 UTC 2011
Hi,
The program below is part of rtems/testsuites/psxtests/psxsignal01,
while I cannot get the output when signal occurs during interruptible
sleep under i386 platform.
#include<bsp.h>
#include<pthread.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#include<signal.h>
#include<errno.h>
#include<inttypes.h>
void *POSIX_Init(void *argument);
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 5
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
(RTEMS_MINIMUM_STACK_SIZE * 4)
#define CONFIGURE_MAXIMUM_TIMERS 1
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
rtems_id Timer_id[ 1 ]; /* array of timer ids */
rtems_name Timer_name[ 1 ]; /* array of timer names */
pthread_t Init_id;
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
extern void _POSIX_signals_Abnormal_termination_handler( int signo );
volatile int Signal_occurred;
volatile int Signal_count;
void Signal_handler(int signo){
Signal_count++;
printf("Signal: %d caught by 0x%"PRIx32 "
(%d)\n",signo,pthread_self(),Signal_count);
Signal_occurred = 1;
}
rtems_timer_service_routine Signal_duringISR_TSR(rtems_id
ignored_id,void *ignored_address){
int status;
status = pthread_kill( pthread_self(), SIGUSR1 );
}
void *POSIX_Init( void *argument){
int status;
struct sigaction act;
sigset_t mask;
rtems_interval start, end;
Signal_count = 0;
Signal_occurred=0;
act.sa_handler = Signal_handler;
act.sa_flags = 0;
sigaction( SIGUSR1, &act, NULL );
sigemptyset( &mask );
sigaddset( &mask, SIGUSR1 );
sigprocmask( SIG_UNBLOCK, &mask, NULL );
kill(getpid(),SIGUSR1);
Timer_name[0]= rtems_build_name( 'T', 'M', '1', ' ' );
rtems_timer_create( Timer_name[0], &Timer_id[0]);
puts( "Init: send SIGUSR1 to process from a TSR (interruptible sleep)" );
Signal_occurred=0;
status = rtems_timer_fire_after(
Timer_id[ 0 ],
1,
Signal_duringISR_TSR,
NULL
);
sleep(5);
/* signal occurs during interruptible sleep */
/* now schedule another one to fire but do not sleep */
puts( "Init: send SIGUSR1 to process from a TSR (spin)" );
Signal_occurred=0;
start = rtems_clock_get_ticks_since_boot();
status = rtems_timer_fire_after(
Timer_id[ 0 ],
10,
Signal_duringISR_TSR,
NULL
);
do {
end = rtems_clock_get_ticks_since_boot();
} while ( !Signal_occurred && ((end - start) <= 800));
if ( !Signal_occurred ) {
puts( "Signal did not occur" );
exit(0);
}
puts("*** Validate unexpected program termination ***");
puts( "*** END OF POSIX TEST SIGNAL ***" );
exit(0);
}
The output is :
Signal: 25 caught by 0xb010001 (1)
Init: send SIGUSR1 to process from a TSR (interruptible sleep)
Init: send SIGUSR1 to process from a TSR (spin)
Signal: 25 caught by 0xb010001 (2)
*** Validate unexpected program termination ***
*** END OF POSIX TEST SIGNAL ***
Best Regards,
Jie
More information about the users
mailing list