diff options
Diffstat (limited to 'cpukit/sapi/src/ioregisterdriver.c')
-rw-r--r-- | cpukit/sapi/src/ioregisterdriver.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/cpukit/sapi/src/ioregisterdriver.c b/cpukit/sapi/src/ioregisterdriver.c index 33ee6b0b72..1d32320641 100644 --- a/cpukit/sapi/src/ioregisterdriver.c +++ b/cpukit/sapi/src/ioregisterdriver.c @@ -21,9 +21,9 @@ #include "config.h" #endif -#include <rtems/io.h> -#include <rtems/rtems/intr.h> -#include <rtems/score/threaddispatch.h> +#include <rtems/ioimpl.h> + +ISR_LOCK_DEFINE( , _IO_Driver_registration_lock, "IO Driver Registration" ) static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table @@ -64,6 +64,7 @@ rtems_status_code rtems_io_register_driver( ) { rtems_device_major_number major_limit = _IO_Number_of_drivers; + ISR_lock_Context lock_context; if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; @@ -83,13 +84,13 @@ rtems_status_code rtems_io_register_driver( if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; - _Thread_Disable_dispatch(); + _IO_Driver_registration_acquire( &lock_context ); if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { - _Thread_Enable_dispatch(); + _IO_Driver_registration_release( &lock_context ); return sc; } major = *registered_major; @@ -97,7 +98,7 @@ rtems_status_code rtems_io_register_driver( rtems_driver_address_table *const table = _IO_Driver_address_table + major; if ( !rtems_io_is_empty_table( table ) ) { - _Thread_Enable_dispatch(); + _IO_Driver_registration_release( &lock_context ); return RTEMS_RESOURCE_IN_USE; } @@ -106,7 +107,7 @@ rtems_status_code rtems_io_register_driver( _IO_Driver_address_table [major] = *driver_table; - _Thread_Enable_dispatch(); + _IO_Driver_registration_release( &lock_context ); if ( _IO_All_drivers_initialized ) { /* Other drivers have already been initialized, we initialize |