/* * COPYRIGHT (c) 1989-2013. * 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 #define TEST_INIT #include #include #include #include #include #include #include "test_support.h" const char rtems_test_name[] = "PSXTMSEM 01"; /* forward declarations to avoid warnings */ void *POSIX_Init(void *argument); #define MAX_SEMS 2 sem_t sem1; sem_t *n_sem1; sem_t *n_sem2; static void benchmark_sem_init(void) { benchmark_timer_t end_time; int status; benchmark_timer_initialize(); status = sem_init( &sem1, 0, 1 ); end_time = benchmark_timer_read(); rtems_test_assert( status == 0 ); put_time( "sem_init: only case", end_time, 1, /* Only executed once */ 0, 0 ); } static void benchmark_sem_destroy(void) { benchmark_timer_t end_time; int status; benchmark_timer_initialize(); status = sem_destroy( &sem1 ); end_time = benchmark_timer_read(); rtems_test_assert( status == 0 ); put_time( "sem_destroy: only case", end_time, 1, /* Only executed once */ 0, 0 ); } static void benchmark_sem_open(bool report_time) { benchmark_timer_t end_time; benchmark_timer_initialize(); n_sem1 = sem_open( "sem1", O_CREAT, 0777, 1 ); end_time = benchmark_timer_read(); if ( report_time ) { put_time( "sem_open: first open O_CREAT", end_time, 1, /* Only executed once */ 0, 0 ); } } static void benchmark_sem_close(bool report_time) { benchmark_timer_t end_time; int status; benchmark_timer_initialize(); status = sem_close( n_sem1 ); end_time = benchmark_timer_read(); rtems_test_assert( status == 0 ); if ( report_time ) { put_time( "sem_close: named first/nested close", end_time, 1, /* Only executed once */ 0, 0 ); } } static void benchmark_sem_unlink(const char *message) { benchmark_timer_t end_time; int status; benchmark_timer_initialize(); status = sem_unlink( "sem1" ); end_time = benchmark_timer_read(); rtems_test_assert( status == 0 ); put_time( message, end_time, 1, /* Only executed once */ 0, 0 ); } static void benchmark_sem_open_second(void) { benchmark_timer_t end_time; benchmark_timer_initialize(); n_sem2 = sem_open( "sem1", O_EXCL, 0777, 1 ); end_time = benchmark_timer_read(); put_time( "sem_open: second open O_EXCL", end_time, 1, /* Only executed once */ 0, 0 ); } static void benchmark_sem_close_second(void) { benchmark_timer_t end_time; int status; benchmark_timer_initialize(); status = sem_close( n_sem2 ); end_time = benchmark_timer_read(); rtems_test_assert( status == 0 ); put_time( "sem_close: named second close", end_time, 1, /* Only executed once */ 0, 0 ); } void *POSIX_Init(void *argument) { TEST_BEGIN(); /* creating unnamed semaphore */ benchmark_sem_init(); /* destroying unnamed semaphore */ benchmark_sem_destroy(); /* opening named semaphore first time o_flag = O_CREAT */ benchmark_sem_open(true); /* opening named semaphore second time o_flag = O_EXCL */ benchmark_sem_open_second(); /* close named semaphore first time -- does not delete */ benchmark_sem_close(true); /* unlink named semaphore -- does not delete */ benchmark_sem_unlink("sem_unlink: does not delete"); /* close semaphore the second time, this actually deletes it */ benchmark_sem_close_second(); /* recrate named semaphore first time o_flag = O_CREAT */ benchmark_sem_open(false); benchmark_sem_close(false); benchmark_sem_unlink("sem_unlink: deletes semaphore"); TEST_END(); rtems_test_exit(0); } /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_POSIX_THREADS 1 #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES MAX_SEMS #define CONFIGURE_POSIX_INIT_THREAD_TABLE #define CONFIGURE_INIT #include /* end of file */