mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-24 06:35:36 +08:00
Added _CORE_semaphore_Seize_isr_disable.
This commit is contained in:
@@ -16,6 +16,9 @@
|
||||
#ifndef __INLINE_CORE_SEMAPHORE_inl
|
||||
#define __INLINE_CORE_SEMAPHORE_inl
|
||||
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _CORE_semaphore_Is_priority
|
||||
@@ -49,5 +52,58 @@ RTEMS_INLINE_ROUTINE unsigned32 _CORE_semaphore_Get_count(
|
||||
return the_semaphore->count;
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _CORE_semaphore_Seize_isr_disable
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* This routine attempts to receive a unit from the_semaphore.
|
||||
* If a unit is available or if the wait flag is FALSE, then the routine
|
||||
* returns. Otherwise, the calling task is blocked until a unit becomes
|
||||
* available.
|
||||
*
|
||||
* NOTE: There is currently no MACRO version of this routine.
|
||||
*/
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _CORE_semaphore_Seize_isr_disable(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
boolean wait,
|
||||
Watchdog_Interval timeout,
|
||||
ISR_Level *level_p
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
ISR_Level level = *level_p;
|
||||
|
||||
/* disabled when you get here */
|
||||
|
||||
executing = _Thread_Executing;
|
||||
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
|
||||
if ( the_semaphore->count != 0 ) {
|
||||
the_semaphore->count -= 1;
|
||||
_ISR_Enable( level );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !wait ) {
|
||||
_ISR_Enable( level );
|
||||
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
|
||||
return;
|
||||
}
|
||||
|
||||
_Thread_Disable_dispatch();
|
||||
_ISR_Enable( level );
|
||||
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
|
||||
executing->Wait.queue = &the_semaphore->Wait_queue;
|
||||
executing->Wait.id = id;
|
||||
_ISR_Enable( level );
|
||||
|
||||
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
|
||||
_Thread_Enable_dispatch();
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
#ifndef __INLINE_CORE_SEMAPHORE_inl
|
||||
#define __INLINE_CORE_SEMAPHORE_inl
|
||||
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _CORE_semaphore_Is_priority
|
||||
@@ -49,5 +52,58 @@ RTEMS_INLINE_ROUTINE unsigned32 _CORE_semaphore_Get_count(
|
||||
return the_semaphore->count;
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
*
|
||||
* _CORE_semaphore_Seize_isr_disable
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* This routine attempts to receive a unit from the_semaphore.
|
||||
* If a unit is available or if the wait flag is FALSE, then the routine
|
||||
* returns. Otherwise, the calling task is blocked until a unit becomes
|
||||
* available.
|
||||
*
|
||||
* NOTE: There is currently no MACRO version of this routine.
|
||||
*/
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _CORE_semaphore_Seize_isr_disable(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
boolean wait,
|
||||
Watchdog_Interval timeout,
|
||||
ISR_Level *level_p
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
ISR_Level level = *level_p;
|
||||
|
||||
/* disabled when you get here */
|
||||
|
||||
executing = _Thread_Executing;
|
||||
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
|
||||
if ( the_semaphore->count != 0 ) {
|
||||
the_semaphore->count -= 1;
|
||||
_ISR_Enable( level );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !wait ) {
|
||||
_ISR_Enable( level );
|
||||
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
|
||||
return;
|
||||
}
|
||||
|
||||
_Thread_Disable_dispatch();
|
||||
_ISR_Enable( level );
|
||||
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
|
||||
executing->Wait.queue = &the_semaphore->Wait_queue;
|
||||
executing->Wait.id = id;
|
||||
_ISR_Enable( level );
|
||||
|
||||
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
|
||||
_Thread_Enable_dispatch();
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
|
||||
Reference in New Issue
Block a user