summaryrefslogblamecommitdiffstats
path: root/testsuites/psxtests/psxcancel01/init.c
blob: 83c4d5e1a591eef138bf439260996afdc925c2a9 (plain) (tree)
1
2
3
4
5
6
7
8
9
  
                            



                                                           
                                         

   



                    


                    

                                             

                                            
 


                                 
 
                          
 


















                                                                   



                           
                                        
                   

 
                                                          








                                                      
 
                                                         

                           

 
              
 


                                                    
 
                 
                                                       

                                               




                           
 
                                                     
 

                   
 
                                                             
                               
 
                                             

                                             
                                                     
 

                                           

                       
                                        
                                                               

                       
                                                                   







                           

                          
 
               




                                           
                               
 










                                                                   
 
             





                                                                      
                                                         



                                                

                                                                 
                                                



                                         
/*
 *  COPYRIGHT (c) 1989-2012.
 *  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.rtems.org/license/LICENSE.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <pmacros.h>
#include <errno.h>

const char rtems_test_name[] = "PSXCANCEL 1";

/* forward declarations to avoid warnings */
void *POSIX_Init(void *argument);

static volatile int TSR_occurred;

static volatile int TSR_status;

static rtems_id  timer_id;

static pthread_t thread;

static void *suspend_self( void *arg )
{
  int               eno;
  rtems_status_code status;

  (void) arg;

  eno = pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS, NULL );
  rtems_test_assert( eno == 0 );

  status = rtems_task_suspend( RTEMS_SELF);
  rtems_test_assert( status == RTEMS_SUCCESSFUL );

  return NULL;
}

static rtems_timer_service_routine Cancel_duringISR_TSR(
  rtems_id  ignored_id,
  void     *ignored_address
)
{
  TSR_status = pthread_cancel( thread );
  TSR_occurred = 1;
}

static rtems_timer_service_routine SetState_duringISR_TSR(
  rtems_id  ignored_id,
  void     *ignored_address
)
{
  int oldstate;

  TSR_status = pthread_setcancelstate( 0, &oldstate );
  TSR_occurred = 1;
}

static rtems_timer_service_routine SetType_duringISR_TSR(
  rtems_id  ignored_id,
  void     *ignored_address
)
{
  int oldtype;

  TSR_status = pthread_setcanceltype( 0, &oldtype );
  TSR_occurred = 1;
}

static void doit(
  rtems_timer_service_routine (*TSR)(rtems_id, void *),
  const char                   *method,
  int                           expected_status
)
{
  rtems_interval    start;
  rtems_interval    end;
  rtems_status_code status;

  printf( "Init: schedule %s from a TSR\n", method );

  TSR_occurred = 0;
  TSR_status   = 0;

  status = rtems_timer_fire_after( timer_id, 10, TSR, NULL );
  rtems_test_assert( !status );

  start = rtems_clock_get_ticks_since_boot();
  do {
    end = rtems_clock_get_ticks_since_boot();
  } while ( !TSR_occurred && ((end - start) <= 800));

  if ( !TSR_occurred ) {
    printf( "%s did not occur\n", method );
    rtems_test_exit(0);
  }
  if ( TSR_status != expected_status ) {
    printf( "%s returned %s\n", method, strerror(TSR_status) );
    rtems_test_exit(0);
  }
  printf( "%s - from ISR returns expected status - OK\n", method );

}

void *POSIX_Init(
  void *argument
)
{
  rtems_status_code status;
  int               eno;
  void             *value;

  TEST_BEGIN();

  status = rtems_timer_create(
    rtems_build_name( 'T', 'M', '1', ' ' ),
    &timer_id
  );
  rtems_test_assert( !status );

  eno = pthread_create( &thread, NULL, suspend_self, NULL );
  rtems_test_assert( eno == 0 );

  doit( Cancel_duringISR_TSR, "pthread_cancel", 0 );
  doit( SetState_duringISR_TSR, "pthread_setcancelstate", EPROTO );
  doit( SetType_duringISR_TSR, "pthread_setcanceltype", EPROTO );

  value = NULL;
  eno = pthread_join( thread, &value );
  rtems_test_assert( eno == 0 );
  rtems_test_assert( value == PTHREAD_CANCELED );

  TEST_END();
  rtems_test_exit(0);
  return NULL; /* just so the compiler thinks we returned something */
}

/* configuration information */

#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER

#define CONFIGURE_MAXIMUM_TIMERS        1

#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION

#define CONFIGURE_MAXIMUM_POSIX_THREADS        2
#define CONFIGURE_POSIX_INIT_THREAD_TABLE

#define CONFIGURE_INIT
#include <rtems/confdefs.h>