2009-10-06 Joel Sherrill <joel.sherrill@oarcorp.com>

* sapi/src/ioregisterdriver.c: Reowork so this is a context switch
	disable critical section not interrupt disable critical section.
	Hopefully eliminated dead code which showed up in coverage runs.
This commit is contained in:
Joel Sherrill
2009-10-06 22:42:48 +00:00
parent 133bffb9be
commit 7b1df57761
2 changed files with 28 additions and 53 deletions

View File

@@ -1,3 +1,9 @@
2009-10-06 Joel Sherrill <joel.sherrill@oarcorp.com>
* sapi/src/ioregisterdriver.c: Reowork so this is a context switch
disable critical section not interrupt disable critical section.
Hopefully eliminated dead code which showed up in coverage runs.
2009-10-04 Sebastian Huber <Sebastian.Huber@embedded-brains.de>
* sapi/include/rtems/io.h, sapi/src/ioregisterdriver.c: Documenation.

View File

@@ -26,15 +26,7 @@
#include <rtems/system.h>
#include <rtems/io.h>
#include <rtems/rtems/intr.h>
rtems_status_code rtems_io_driver_io_error(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
)
{
return RTEMS_IO_ERROR;
}
#include <rtems/score/thread.h>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
@@ -43,13 +35,6 @@ static inline bool rtems_io_is_empty_table(
return table->initialization_entry == NULL && table->open_entry == NULL;
}
static inline void rtems_io_occupy_table(
rtems_driver_address_table *table
)
{
table->open_entry = rtems_io_driver_io_error;
}
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
@@ -57,80 +42,62 @@ static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number n = _IO_Number_of_drivers;
rtems_device_major_number m = 0;
if ( major == NULL ) {
return RTEMS_INVALID_ADDRESS;
}
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
rtems_driver_address_table *const table = _IO_Driver_address_table + m;
rtems_interrupt_level level;
rtems_interrupt_disable( level );
if ( rtems_io_is_empty_table( table ) ) {
rtems_io_occupy_table( table );
rtems_interrupt_enable( level );
if ( rtems_io_is_empty_table( table ) )
break;
}
rtems_interrupt_enable( level );
}
/* Assigns invalid value in case of failure */
*major = m;
if ( m != n ) {
if ( m != n )
return RTEMS_SUCCESSFUL;
} else {
return RTEMS_TOO_MANY;
}
return RTEMS_TOO_MANY;
}
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( registered_major == NULL ) {
if ( registered_major == NULL )
return RTEMS_INVALID_ADDRESS;
}
/* Set it to an invalid value */
*registered_major = major_limit;
if ( driver_table == NULL ) {
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
}
if ( rtems_io_is_empty_table( driver_table ) ) {
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
}
if ( major >= major_limit ) {
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
}
_Thread_Disable_dispatch();
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc == RTEMS_SUCCESSFUL ) {
major = *registered_major;
} else {
return RTEMS_TOO_MANY;
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
rtems_interrupt_level level;
rtems_interrupt_disable( level );
if ( rtems_io_is_empty_table( table ) ) {
rtems_io_occupy_table( table );
rtems_interrupt_enable( level );
} else {
rtems_interrupt_enable( level );
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
@@ -139,5 +106,7 @@ rtems_status_code rtems_io_register_driver(
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}