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