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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems/] [c/] [src/] [tests/] [psxtests/] [psx02/] [init.c] - Rev 1765

Compare with Previous | Blame | View Log

/* 
 *  COPYRIGHT (c) 1989-1999.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *
 *  $Id: init.c,v 1.2 2001-09-27 12:02:23 chris Exp $
 */
 
#define CONFIGURE_INIT
#include "system.h"
#include <signal.h>
 
volatile int Signal_occurred;
volatile int Signal_count;
 
void Signal_handler(
  int signo
)
{
  Signal_count++;
  printf(
    "Signal: %d caught by 0x%x (%d)\n",
    signo,
    pthread_self(),
    Signal_count
  );
  Signal_occurred = 1;
}
 
void *POSIX_Init(
  void *argument
)
{
  int               status;
  struct timespec   tv;
  struct timespec   tr;
  struct sigaction  act;
  sigset_t          mask;
  sigset_t          pending_set;
 
  puts( "\n\n*** POSIX TEST 2 ***" );
 
  /* set the time of day, and print our buffer in multiple ways */
 
  set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
 
  /* get id of this thread */
 
  Init_id = pthread_self();
  printf( "Init's ID is 0x%08x\n", Init_id );
 
  /* install a signal handler */
 
  status = sigemptyset( &act.sa_mask );
  assert( !status );
 
  act.sa_handler = Signal_handler;
  act.sa_flags   = 0;
 
  sigaction( SIGUSR1, &act, NULL );
 
  /* simple signal to self */
 
  Signal_count = 0;
  Signal_occurred = 0;
 
  status = pthread_kill( Init_id, SIGUSR1 );
  assert( !status );
 
  Signal_occurred = 0;
 
  /* now block the signal, send it, see if it is pending, and unblock it */
 
  status = sigemptyset( &mask );
  assert( !status );
 
  status = sigaddset( &mask, SIGUSR1 );
  assert( !status );
 
  printf( "Init: Block SIGUSR1\n" );
  status = sigprocmask( SIG_BLOCK, &mask, NULL );
  assert( !status );
 
  status = sigpending( &pending_set );
  assert( !status );
  printf( "Init: Signals pending 0x%08x\n", pending_set );
 
 
  printf( "Init: send SIGUSR1 to self\n" );
  status = pthread_kill( Init_id, SIGUSR1 );
  assert( !status );
 
  status = sigpending( &pending_set );
  assert( !status );
  printf( "Init: Signals pending 0x%08x\n", pending_set );
 
  printf( "Init: Unblock SIGUSR1\n" );
  status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
  assert( !status );
 
  /* create a thread */
 
  status = pthread_create( &Task_id, NULL, Task_1_through_3, NULL );
  assert( !status );
 
  /*
   *  Loop for 5 seconds seeing how many signals we catch 
   */
 
  tr.tv_sec = 5;
  tr.tv_nsec = 0;
 
  do {
    tv = tr;
 
    Signal_occurred = 0;
 
    status = nanosleep ( &tv, &tr );
 
    if ( status == -1 ) {
      assert( errno == EINTR );
      assert( tr.tv_nsec || tr.tv_sec );
    } else if ( !status ) {
      assert( !tr.tv_nsec && !tr.tv_sec );
    }
 
    printf(
      "Init: signal was %sprocessed with %d:%d time remaining\n",
      (Signal_occurred) ? "" : "not ",
      (int) tr.tv_sec,
      (int) tr.tv_nsec
   );
 
  } while ( tr.tv_sec || tr.tv_nsec );
 
  /* exit this thread */
 
  puts( "*** END OF POSIX TEST 2 ***" );
  exit( 0 );
 
  return NULL; /* just so the compiler thinks we returned something */
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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