There is no need for an ISR lock since the Dual_ported_memory_Control is immutable after initialization. ISR disable is enough for deletion safety on uni-processor configurations.
Update #2555. --- cpukit/rtems/include/rtems/rtems/dpmemimpl.h | 18 +++-------- cpukit/rtems/src/dpmemdelete.c | 33 ++++++------------- cpukit/rtems/src/dpmemexternal2internal.c | 47 ++++++++++++--------------- cpukit/rtems/src/dpmeminternal2external.c | 48 ++++++++++++---------------- 4 files changed, 54 insertions(+), 92 deletions(-) diff --git a/cpukit/rtems/include/rtems/rtems/dpmemimpl.h b/cpukit/rtems/include/rtems/rtems/dpmemimpl.h index 213856d..1e96722 100644 --- a/cpukit/rtems/include/rtems/rtems/dpmemimpl.h +++ b/cpukit/rtems/include/rtems/rtems/dpmemimpl.h @@ -66,23 +66,13 @@ RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free ( _Objects_Free( &_Dual_ported_memory_Information, &the_port->Object ); } -/** - * @brief Maps port IDs to port control blocks. - * - * This function maps port IDs to port control blocks. If ID - * corresponds to a local port, then it returns the_port control - * pointer which maps to ID and location is set to OBJECTS_LOCAL. - * Global ports are not supported, thus if ID does not map to a - * local port, location is set to OBJECTS_ERROR and the_port is - * undefined. - */ -RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get ( - Objects_Id id, - Objects_Locations *location +RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get( + Objects_Id id, + ISR_lock_Context *lock_context ) { return (Dual_ported_memory_Control *) - _Objects_Get( &_Dual_ported_memory_Information, id, location ); + _Objects_Get_local( id, &_Dual_ported_memory_Information, lock_context ); } /**@}*/ diff --git a/cpukit/rtems/src/dpmemdelete.c b/cpukit/rtems/src/dpmemdelete.c index 6f11a53..f303629 100644 --- a/cpukit/rtems/src/dpmemdelete.c +++ b/cpukit/rtems/src/dpmemdelete.c @@ -18,39 +18,26 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/support.h> -#include <rtems/score/address.h> #include <rtems/rtems/dpmemimpl.h> -#include <rtems/score/thread.h> rtems_status_code rtems_port_delete( rtems_id id ) { - Dual_ported_memory_Control *the_port; - Objects_Locations location; + Dual_ported_memory_Control *the_port; + ISR_lock_Context lock_context; _Objects_Allocator_lock(); - the_port = _Dual_ported_memory_Get( id, &location ); - switch ( location ) { + the_port = _Dual_ported_memory_Get( id, &lock_context ); - case OBJECTS_LOCAL: - _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object ); - _Objects_Put( &the_port->Object ); - _Dual_ported_memory_Free( the_port ); - _Objects_Allocator_unlock(); - return RTEMS_SUCCESSFUL; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: /* this error cannot be returned */ -#endif - case OBJECTS_ERROR: - break; + if ( the_port == NULL ) { + _Objects_Allocator_unlock(); + return RTEMS_INVALID_ID; } + _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object ); + _ISR_lock_ISR_enable( &lock_context ); + _Dual_ported_memory_Free( the_port ); _Objects_Allocator_unlock(); - - return RTEMS_INVALID_ID; + return RTEMS_SUCCESSFUL; } diff --git a/cpukit/rtems/src/dpmemexternal2internal.c b/cpukit/rtems/src/dpmemexternal2internal.c index 237d5c4..0456010 100644 --- a/cpukit/rtems/src/dpmemexternal2internal.c +++ b/cpukit/rtems/src/dpmemexternal2internal.c @@ -18,12 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/support.h> -#include <rtems/score/address.h> #include <rtems/rtems/dpmemimpl.h> -#include <rtems/score/thread.h> +#include <rtems/score/address.h> rtems_status_code rtems_port_external_to_internal( rtems_id id, @@ -31,31 +27,28 @@ rtems_status_code rtems_port_external_to_internal( void **internal ) { - Dual_ported_memory_Control *the_port; - Objects_Locations location; - uint32_t ending; + Dual_ported_memory_Control *the_port; + ISR_lock_Context lock_context; + uint32_t ending; - if ( !internal ) + if ( internal == NULL ) { return RTEMS_INVALID_ADDRESS; + } - the_port = _Dual_ported_memory_Get( id, &location ); - switch ( location ) { - case OBJECTS_LOCAL: - ending = _Addresses_Subtract( external, the_port->external_base ); - if ( ending > the_port->length ) - *internal = external; - else - *internal = _Addresses_Add_offset( the_port->internal_base, - ending ); - _Objects_Put( &the_port->Object ); - return RTEMS_SUCCESSFUL; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: /* this error cannot be returned */ -#endif - case OBJECTS_ERROR: - break; + the_port = _Dual_ported_memory_Get( id, &lock_context ); + + if ( the_port == NULL ) { + return RTEMS_INVALID_ID; + } + + ending = _Addresses_Subtract( external, the_port->external_base ); + + if ( ending > the_port->length ) { + *internal = external; + } else { + *internal = _Addresses_Add_offset( the_port->internal_base, ending ); } - return RTEMS_INVALID_ID; + _ISR_lock_ISR_enable( &lock_context ); + return RTEMS_SUCCESSFUL; } diff --git a/cpukit/rtems/src/dpmeminternal2external.c b/cpukit/rtems/src/dpmeminternal2external.c index e048d8a..bd66ee4 100644 --- a/cpukit/rtems/src/dpmeminternal2external.c +++ b/cpukit/rtems/src/dpmeminternal2external.c @@ -18,12 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/support.h> -#include <rtems/score/address.h> #include <rtems/rtems/dpmemimpl.h> -#include <rtems/score/thread.h> +#include <rtems/score/address.h> rtems_status_code rtems_port_internal_to_external( rtems_id id, @@ -31,32 +27,28 @@ rtems_status_code rtems_port_internal_to_external( void **external ) { - Dual_ported_memory_Control *the_port; - Objects_Locations location; - uint32_t ending; + Dual_ported_memory_Control *the_port; + ISR_lock_Context lock_context; + uint32_t ending; - if ( !external ) + if ( external == NULL ) { return RTEMS_INVALID_ADDRESS; + } - the_port = _Dual_ported_memory_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - ending = _Addresses_Subtract( internal, the_port->internal_base ); - if ( ending > the_port->length ) - *external = internal; - else - *external = _Addresses_Add_offset( the_port->external_base, - ending ); - _Objects_Put( &the_port->Object ); - return RTEMS_SUCCESSFUL; - -#if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: /* this error cannot be returned */ -#endif - case OBJECTS_ERROR: - break; + the_port = _Dual_ported_memory_Get( id, &lock_context ); + + if ( the_port == NULL ) { + return RTEMS_INVALID_ID; + } + + ending = _Addresses_Subtract( internal, the_port->internal_base ); + + if ( ending > the_port->length ) { + *external = internal; + } else { + *external = _Addresses_Add_offset( the_port->external_base, ending ); } - return RTEMS_INVALID_ID; + _ISR_lock_ISR_enable( &lock_context ); + return RTEMS_SUCCESSFUL; } -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel