forked from Imagelibrary/rtems
score: Add and use _Thread_Dispatch_is_enabled()
Delete _Thread_Dispatch_in_critical_section() and _Thread_Is_dispatching_enabled().
This commit is contained in:
@@ -56,12 +56,12 @@ void _BSP_Fatal_error(unsigned int v)
|
||||
printk(" UNKNOWN (0x%x)\n",THESRC);
|
||||
break;
|
||||
}
|
||||
if ( _Thread_Dispatch_in_critical_section() )
|
||||
if ( _Thread_Dispatch_is_enabled() )
|
||||
printk("enabled\n");
|
||||
else
|
||||
printk(
|
||||
" Error occurred in a Thread Dispatching DISABLED context (level %i)\n",
|
||||
_Thread_Dispatch_get_disable_level());
|
||||
else
|
||||
printk("enabled\n");
|
||||
|
||||
if ( _ISR_Nest_level ) {
|
||||
printk(
|
||||
|
||||
@@ -170,7 +170,7 @@ void __ISR_Handler( uint32_t vector)
|
||||
if ( _ISR_Nest_level )
|
||||
return;
|
||||
|
||||
if ( _Thread_Dispatch_in_critical_section() ) {
|
||||
if ( !_Thread_Dispatch_is_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ void __ISR_Handler( uint32_t vector)
|
||||
if ( _ISR_Nest_level )
|
||||
return;
|
||||
|
||||
if ( _Thread_Dispatch_in_critical_section() ) {
|
||||
if ( !_Thread_Dispatch_is_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ void __ISR_Handler( uint32_t vector)
|
||||
if ( _ISR_Nest_level )
|
||||
return;
|
||||
|
||||
if ( _Thread_Dispatch_in_critical_section() ) {
|
||||
if ( !_Thread_Dispatch_is_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ void __ISR_Handler( uint32_t vector)
|
||||
if ( _ISR_Nest_level )
|
||||
return;
|
||||
|
||||
if ( _Thread_Dispatch_in_critical_section() ) {
|
||||
if ( !_Thread_Dispatch_is_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ RTEMS_CHAIN_DEFINE_EMPTY(RTEMS_Malloc_GC_list);
|
||||
|
||||
bool malloc_is_system_state_OK(void)
|
||||
{
|
||||
if ( _Thread_Dispatch_in_critical_section() )
|
||||
if ( !_Thread_Dispatch_is_enabled() )
|
||||
return false;
|
||||
|
||||
if ( _ISR_Nest_level > 0 )
|
||||
|
||||
@@ -38,7 +38,7 @@ void *realloc(
|
||||
*/
|
||||
|
||||
if (_System_state_Is_up(_System_state_Get())) {
|
||||
if (_Thread_Dispatch_in_critical_section())
|
||||
if (!_Thread_Dispatch_is_enabled())
|
||||
return (void *) 0;
|
||||
|
||||
if (_ISR_Nest_level > 0)
|
||||
|
||||
@@ -178,7 +178,7 @@ void rtems_filesystem_global_location_release(
|
||||
rtems_filesystem_global_location_t *global_loc
|
||||
)
|
||||
{
|
||||
if (!_Thread_Dispatch_in_critical_section()) {
|
||||
if (_Thread_Dispatch_is_enabled()) {
|
||||
release_with_count(global_loc, 1);
|
||||
} else {
|
||||
if (global_loc->deferred_released_count == 0) {
|
||||
|
||||
@@ -35,7 +35,7 @@ rtems_status_code rtems_clock_tick( void )
|
||||
_Scheduler_Tick();
|
||||
|
||||
if ( _Thread_Is_context_switch_necessary() &&
|
||||
_Thread_Is_dispatching_enabled() )
|
||||
_Thread_Dispatch_is_enabled() )
|
||||
_Thread_Dispatch();
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
|
||||
@@ -72,7 +72,7 @@ void __ISR_Handler(uint32_t vector, CPU_Interrupt_frame *ifr)
|
||||
if ( _ISR_Nest_level )
|
||||
return;
|
||||
|
||||
if ( _Thread_Dispatch_necessary && !_Thread_Dispatch_in_critical_section() ) {
|
||||
if ( _Thread_Dispatch_necessary && _Thread_Dispatch_is_enabled() ) {
|
||||
/* save off our stack frame so the context switcher can get to it */
|
||||
_exception_stack_frame = ifr;
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ void __ISR_Handler(void)
|
||||
stack_ptr = _old_stack_ptr;
|
||||
#endif
|
||||
|
||||
if( !_Thread_Dispatch_in_critical_section() )
|
||||
if( _Thread_Dispatch_is_enabled() )
|
||||
{
|
||||
if ( _Thread_Dispatch_necessary ) {
|
||||
_CPU_ISR_Enable( level );
|
||||
|
||||
@@ -352,7 +352,7 @@ void _CORE_mutex_Seize_interrupt_blocking(
|
||||
#define _CORE_mutex_Check_dispatch_for_seize(_wait) 0
|
||||
#else
|
||||
#define _CORE_mutex_Check_dispatch_for_seize(_wait) \
|
||||
(_Thread_Dispatch_in_critical_section() \
|
||||
(!_Thread_Dispatch_is_enabled() \
|
||||
&& (_wait) \
|
||||
&& (_System_state_Get() >= SYSTEM_STATE_BEGIN_MULTITASKING))
|
||||
#endif
|
||||
|
||||
@@ -46,6 +46,19 @@ extern "C" {
|
||||
*/
|
||||
SCORE_EXTERN volatile uint32_t _Thread_Dispatch_disable_level;
|
||||
|
||||
/**
|
||||
* @brief Indicates if the executing thread is inside a thread dispatch
|
||||
* critical section.
|
||||
*
|
||||
* @retval true Thread dispatching is enabled.
|
||||
* @retval false The executing thread is inside a thread dispatch critical
|
||||
* section and dispatching is not allowed.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_is_enabled(void)
|
||||
{
|
||||
return _Thread_Dispatch_disable_level == 0;
|
||||
}
|
||||
|
||||
#if defined(RTEMS_SMP)
|
||||
typedef struct {
|
||||
SMP_lock_Control lock;
|
||||
@@ -67,14 +80,6 @@ SCORE_EXTERN volatile uint32_t _Thread_Dispatch_disable_level;
|
||||
*/
|
||||
void _Thread_Dispatch_initialization(void);
|
||||
|
||||
/**
|
||||
* @brief Checks if thread dispatch says that we are in a critical section.
|
||||
*
|
||||
* This routine returns true if thread dispatch indicates
|
||||
* that we are in a critical section.
|
||||
*/
|
||||
bool _Thread_Dispatch_in_critical_section(void);
|
||||
|
||||
/**
|
||||
* @brief Returns value of the the thread dispatch level.
|
||||
*
|
||||
@@ -104,20 +109,6 @@ SCORE_EXTERN volatile uint32_t _Thread_Dispatch_disable_level;
|
||||
*/
|
||||
uint32_t _Thread_Dispatch_decrement_disable_level(void);
|
||||
#else /* RTEMS_SMP */
|
||||
/**
|
||||
* @brief _Thread_Dispatch_in_critical_section
|
||||
*
|
||||
* This routine returns true if thread dispatch indicates
|
||||
* that we are in a critical section.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_in_critical_section(void)
|
||||
{
|
||||
if ( _Thread_Dispatch_disable_level == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get thread dispatch disable level.
|
||||
*
|
||||
@@ -246,16 +237,6 @@ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
|
||||
_Thread_Dispatch_decrement_disable_level();
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if dispatching is disabled, and false
|
||||
* otherwise.
|
||||
*/
|
||||
|
||||
RTEMS_INLINE_ROUTINE bool _Thread_Is_dispatching_enabled( void )
|
||||
{
|
||||
return ( _Thread_Dispatch_in_critical_section() == false );
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
* is the task stack of a thread that deletes itself. The thread dispatch
|
||||
* disable level is a way to detect this use case.
|
||||
*/
|
||||
if ( !_Thread_Dispatch_in_critical_section() ) {
|
||||
if ( _Thread_Dispatch_is_enabled() ) {
|
||||
Heap_Block *const next = block->Protection_begin.next_delayed_free_block;
|
||||
if ( next == NULL ) {
|
||||
_Heap_Protection_delay_block_free( heap, block );
|
||||
|
||||
@@ -37,7 +37,7 @@ bool _Protected_heap_Walk(
|
||||
*
|
||||
* NOTE: Dispatching is also disabled during initialization.
|
||||
*/
|
||||
if ( _Thread_Dispatch_in_critical_section() == false ) {
|
||||
if ( _Thread_Dispatch_is_enabled() ) {
|
||||
_RTEMS_Lock_allocator();
|
||||
status = _Heap_Walk( the_heap, source, do_dump );
|
||||
_RTEMS_Unlock_allocator();
|
||||
|
||||
@@ -39,14 +39,6 @@ void _Thread_Dispatch_initialization( void )
|
||||
_Thread_Dispatch_set_disable_level( 1 );
|
||||
}
|
||||
|
||||
bool _Thread_Dispatch_in_critical_section(void)
|
||||
{
|
||||
if ( _Thread_Dispatch_disable_level == 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32_t _Thread_Dispatch_get_disable_level(void)
|
||||
{
|
||||
return _Thread_Dispatch_disable_level;
|
||||
|
||||
@@ -54,13 +54,13 @@ extern "C" {
|
||||
#define check_dispatch_disable_level( _expect ) \
|
||||
do { \
|
||||
if ( (_expect) != -1 \
|
||||
&& ((_Thread_Dispatch_in_critical_section() == false && (_expect) != 0) \
|
||||
|| (_Thread_Dispatch_in_critical_section() && (_expect) == 0)) \
|
||||
&& ((!_Thread_Dispatch_is_enabled() == false && (_expect) != 0) \
|
||||
|| (!_Thread_Dispatch_is_enabled() && (_expect) == 0)) \
|
||||
) { \
|
||||
printk( \
|
||||
"\n_Thread_Dispatch_disable_level is (%" PRId32 \
|
||||
") not %d detected at %s:%d\n", \
|
||||
_Thread_Dispatch_in_critical_section(), (_expect), __FILE__, __LINE__ ); \
|
||||
!_Thread_Dispatch_is_enabled(), (_expect), __FILE__, __LINE__ ); \
|
||||
FLUSH_OUTPUT(); \
|
||||
rtems_test_exit( 1 ); \
|
||||
} \
|
||||
|
||||
Reference in New Issue
Block a user