This makes it necessary to add a function to destroy RTEMS chains: rtems_chain_destroy(). This function complicates the RTEMS chains API. --- cpukit/libcsupport/src/termios.c | 1 + cpukit/rtems/include/rtems/rtems/intr.h | 10 ++++++++++ cpukit/sapi/include/rtems/chain.h | 16 ++++++++++++++++ cpukit/score/include/rtems/score/isrlock.h | 16 ++++++++++++++++ cpukit/score/include/rtems/score/smplock.h | 16 ++++++++++++++-- testsuites/libtests/block06/init.c | 10 ++++++++++ testsuites/sptests/sp37/init.c | 4 ++++ testsuites/sptests/spchain/init.c | 20 ++++++++++++++++++++ 8 files changed, 91 insertions(+), 2 deletions(-)
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index ea0e87a..65072a0 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -445,6 +445,7 @@ rtems_termios_close (void *arg) if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); + rtems_interrupt_lock_destroy (&tty->interrupt_lock); free (tty->rawInBuf.theBuf); free (tty->rawOutBuf.theBuf); free (tty->cbuf); diff --git a/cpukit/rtems/include/rtems/rtems/intr.h b/cpukit/rtems/include/rtems/rtems/intr.h index 62d2dad..04bcb72 100644 --- a/cpukit/rtems/include/rtems/rtems/intr.h +++ b/cpukit/rtems/include/rtems/rtems/intr.h @@ -180,6 +180,16 @@ typedef ISR_lock_Context rtems_interrupt_lock_context; _ISR_lock_Initialize( _lock ) /** + * @brief Destroys an interrupt lock. + * + * Concurrent destruction leads to unpredictable results. + * + * @param[in,out] _lock The interrupt lock control. + */ +#define rtems_interrupt_lock_destroy( _lock ) \ + _ISR_lock_Destroy( _lock ) + +/** * @brief Acquires an interrupt lock. * * Interrupts will be disabled. On SMP configurations this function acquires diff --git a/cpukit/sapi/include/rtems/chain.h b/cpukit/sapi/include/rtems/chain.h index 0927055..f423e6d 100644 --- a/cpukit/sapi/include/rtems/chain.h +++ b/cpukit/sapi/include/rtems/chain.h @@ -179,6 +179,22 @@ RTEMS_INLINE_ROUTINE void rtems_chain_initialize_empty( } /** + * @brief Destroys the chain. + * + * This routine destroys the specified chain. This routine is only necessary + * in SMP configurations if the protected functions are used and profiling is + * enabled. + * + * @param[in] the_chain is the chain to be destroyed. + */ +RTEMS_INLINE_ROUTINE void rtems_chain_destroy( + rtems_chain_control *the_chain +) +{ + _ISR_lock_Destroy( &the_chain->Lock ); +} + +/** * @brief Set off chain. * * This function sets the next and previous fields of the @a node to NULL diff --git a/cpukit/score/include/rtems/score/isrlock.h b/cpukit/score/include/rtems/score/isrlock.h index e118475..27e4aad 100644 --- a/cpukit/score/include/rtems/score/isrlock.h +++ b/cpukit/score/include/rtems/score/isrlock.h @@ -95,6 +95,22 @@ static inline void _ISR_lock_Initialize( ISR_lock_Control *lock ) } /** + * @brief Destroys an ISR lock. + * + * Concurrent destruction leads to unpredictable results. + * + * @param[in,out] lock The ISR lock control. + */ +static inline void _ISR_lock_Destroy( ISR_lock_Control *lock ) +{ +#if defined( RTEMS_SMP ) + _SMP_lock_Destroy( &lock->lock ); +#else + (void) lock; +#endif +} + +/** * @brief Acquires an ISR lock. * * Interrupts will be disabled. On SMP configurations this function acquires diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h index 101aa0a..cc94e2e 100644 --- a/cpukit/score/include/rtems/score/smplock.h +++ b/cpukit/score/include/rtems/score/smplock.h @@ -131,11 +131,11 @@ typedef struct { #define SMP_LOCK_INITIALIZER { SMP_TICKET_LOCK_INITIALIZER } /** - * @brief Initializes an SMP lock control. + * @brief Initializes an SMP lock. * * Concurrent initialization leads to unpredictable results. * - * @param[out] lock The SMP lock control. + * @param[in,out] lock The SMP lock control. */ static inline void _SMP_lock_Initialize( SMP_lock_Control *lock ) { @@ -143,6 +143,18 @@ static inline void _SMP_lock_Initialize( SMP_lock_Control *lock ) } /** + * @brief Destroys an SMP lock. + * + * Concurrent destruction leads to unpredictable results. + * + * @param[in,out] lock The SMP lock control. + */ +static inline void _SMP_lock_Destroy( SMP_lock_Control *lock ) +{ + (void) lock; +} + +/** * @brief Acquires an SMP lock. * * This function will not disable interrupts. The caller must ensure that the diff --git a/testsuites/libtests/block06/init.c b/testsuites/libtests/block06/init.c index e51bf27..59dd188 100644 --- a/testsuites/libtests/block06/init.c +++ b/testsuites/libtests/block06/init.c @@ -786,6 +786,8 @@ bdbuf_tests_task_0_test_2 (bdbuf_task_control* tc) tc->passed = passed; tc->test = 0; + + rtems_chain_destroy (&buffers); } /** @@ -964,6 +966,8 @@ bdbuf_tests_task_0_test_4 (bdbuf_task_control* tc) tc->passed = passed; tc->test = 0; + + rtems_chain_destroy (&buffers); } static void @@ -1027,6 +1031,8 @@ bdbuf_tests_task_0_test_6 (bdbuf_task_control* tc) tc->passed = passed; tc->test = 0; + + rtems_chain_destroy (&buffers); } static void @@ -1085,6 +1091,8 @@ bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc) tc->passed = passed; tc->test = 0; + + rtems_chain_destroy (&buffers); } static void @@ -1172,6 +1180,8 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc) tc->passed = passed; tc->test = 0; + + rtems_chain_destroy (&buffers); } static void diff --git a/testsuites/sptests/sp37/init.c b/testsuites/sptests/sp37/init.c index cd49ae2..e321a78 100644 --- a/testsuites/sptests/sp37/init.c +++ b/testsuites/sptests/sp37/init.c @@ -178,6 +178,8 @@ static void test_isr_locks( void ) _ISR_lock_Release( &lock, &lock_context ); rtems_test_assert( normal_interrupt_level == _ISR_Get_level() ); + + _ISR_lock_Destroy( &lock ); } static rtems_mode get_interrupt_level( void ) @@ -212,6 +214,8 @@ static void test_interrupt_locks( void ) rtems_interrupt_lock_release_isr( &lock, &lock_context ); rtems_test_assert( normal_interrupt_level == get_interrupt_level() ); + + rtems_interrupt_lock_destroy( &lock ); } void test_interrupt_inline(void) diff --git a/testsuites/sptests/spchain/init.c b/testsuites/sptests/spchain/init.c index 747f404..3a355ad 100644 --- a/testsuites/sptests/spchain/init.c +++ b/testsuites/sptests/spchain/init.c @@ -56,6 +56,8 @@ static void test_chain_control_initializer(void) rtems_chain_immutable_tail( &one_node_chain ) == rtems_chain_immutable_next( &node_of_one_node_chain ) ); + + rtems_chain_destroy( &chain ); } static void test_chain_control_layout(void) @@ -96,6 +98,8 @@ static void test_chain_get_with_wait(void) sc = rtems_chain_get_with_wait( &chain, EVENT, TIMEOUT, &p ); rtems_test_assert( sc == RTEMS_TIMEOUT ); rtems_test_assert( p == NULL ); + + rtems_chain_destroy( &chain ); } static void test_chain_first_and_last(void) @@ -115,6 +119,8 @@ static void test_chain_first_and_last(void) puts( "INIT - Verify rtems_chain_is_last" ); cnode = rtems_chain_last(&chain); rtems_test_assert( rtems_chain_is_last( cnode ) ); + + rtems_chain_destroy( &chain ); } static void test_chain_with_notification(void) @@ -151,6 +157,8 @@ static void test_chain_with_notification(void) rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rtems_test_assert( p == &a ); + rtems_chain_destroy( &chain ); + puts( "INIT - Verify rtems_chain_prepend_with_notification" ); rtems_chain_initialize_empty( &chain ); sc = rtems_chain_prepend_with_notification( @@ -174,6 +182,8 @@ static void test_chain_with_notification(void) rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rtems_test_assert( p == &a ); + rtems_chain_destroy( &chain ); + puts( "INIT - Verify rtems_chain_get_with_notification" ); rtems_chain_initialize_empty( &chain ); @@ -195,6 +205,8 @@ static void test_chain_with_notification(void) ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rtems_test_assert( out == EVENT ); + + rtems_chain_destroy( &chain ); } static void test_chain_with_empty_check(void) @@ -211,6 +223,7 @@ static void test_chain_with_empty_check(void) rtems_test_assert( empty ); empty = rtems_chain_append_with_empty_check( &chain, &a ); rtems_test_assert( !empty ); + rtems_chain_destroy( &chain ); puts( "INIT - Verify rtems_chain_prepend_with_empty_check" ); rtems_chain_initialize_empty( &chain ); @@ -220,6 +233,7 @@ static void test_chain_with_empty_check(void) rtems_test_assert( !empty ); empty = rtems_chain_prepend_with_empty_check( &chain, &b ); rtems_test_assert( !empty ); + rtems_chain_destroy( &chain ); puts( "INIT - Verify rtems_chain_get_with_empty_check" ); rtems_chain_initialize_empty( &chain ); @@ -234,6 +248,8 @@ static void test_chain_with_empty_check(void) empty = rtems_chain_get_with_empty_check( &chain, &p ); rtems_test_assert( empty ); rtems_test_assert( p == &b ); + + rtems_chain_destroy( &chain ); } static void test_chain_node_count(void) @@ -254,6 +270,8 @@ static void test_chain_node_count(void) count = rtems_chain_node_count_unprotected( &chain ); rtems_test_assert( count == i + 1 ); } + + rtems_chain_destroy( &chain ); } static bool test_order( const Chain_Node *left, const Chain_Node *right ) @@ -324,6 +342,8 @@ rtems_task Init( } } + rtems_chain_destroy( &chain1 ); + test_chain_first_and_last(); test_chain_with_empty_check(); test_chain_with_notification(); -- 1.7.7 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel