forked from Imagelibrary/rtems
score: Inline _CORE_semaphore_Surrender()
This commit is contained in:
@@ -177,8 +177,7 @@ libscore_a_SOURCES += src/corerwlock.c src/corerwlockobtainread.c \
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
## CORE_SEMAPHORE_C_FILES
|
## CORE_SEMAPHORE_C_FILES
|
||||||
libscore_a_SOURCES += src/coresem.c \
|
libscore_a_SOURCES += src/coresem.c
|
||||||
src/coresemsurrender.c
|
|
||||||
|
|
||||||
## CORE_SPINLOCK_C_FILES
|
## CORE_SPINLOCK_C_FILES
|
||||||
if HAS_PTHREADS
|
if HAS_PTHREADS
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#define _RTEMS_SCORE_CORESEMIMPL_H
|
#define _RTEMS_SCORE_CORESEMIMPL_H
|
||||||
|
|
||||||
#include <rtems/score/coresem.h>
|
#include <rtems/score/coresem.h>
|
||||||
|
#include <rtems/score/objectimpl.h>
|
||||||
#include <rtems/score/threaddispatch.h>
|
#include <rtems/score/threaddispatch.h>
|
||||||
#include <rtems/score/threadqimpl.h>
|
#include <rtems/score/threadqimpl.h>
|
||||||
#include <rtems/score/statesimpl.h>
|
#include <rtems/score/statesimpl.h>
|
||||||
@@ -118,13 +119,50 @@ RTEMS_INLINE_ROUTINE void _CORE_semaphore_Destroy(
|
|||||||
*
|
*
|
||||||
* @retval an indication of whether the routine succeeded or failed
|
* @retval an indication of whether the routine succeeded or failed
|
||||||
*/
|
*/
|
||||||
CORE_semaphore_Status _CORE_semaphore_Surrender(
|
RTEMS_INLINE_ROUTINE CORE_semaphore_Status _CORE_semaphore_Surrender(
|
||||||
CORE_semaphore_Control *the_semaphore,
|
CORE_semaphore_Control *the_semaphore,
|
||||||
Objects_Id id,
|
Objects_Id id,
|
||||||
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support,
|
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support,
|
||||||
ISR_lock_Context *lock_context
|
ISR_lock_Context *lock_context
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Thread_Control *the_thread;
|
||||||
|
CORE_semaphore_Status status;
|
||||||
|
|
||||||
|
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
|
||||||
|
|
||||||
|
_Thread_queue_Acquire_critical( &the_semaphore->Wait_queue, lock_context );
|
||||||
|
|
||||||
|
the_thread = _Thread_queue_First_locked( &the_semaphore->Wait_queue );
|
||||||
|
if ( the_thread != NULL ) {
|
||||||
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
|
_Thread_Dispatch_disable();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_Thread_queue_Extract_critical(
|
||||||
|
&the_semaphore->Wait_queue,
|
||||||
|
the_thread,
|
||||||
|
lock_context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#if defined(RTEMS_MULTIPROCESSING)
|
||||||
|
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
|
||||||
|
(*api_semaphore_mp_support) ( the_thread, id );
|
||||||
|
|
||||||
|
_Thread_Dispatch_enable( _Per_CPU_Get() );
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
|
||||||
|
the_semaphore->count += 1;
|
||||||
|
else
|
||||||
|
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
|
||||||
|
|
||||||
|
_Thread_queue_Release( &the_semaphore->Wait_queue, lock_context );
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Core semaphore flush.
|
* @brief Core semaphore flush.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* @brief Surrenders a Unit to a Semaphore
|
|
||||||
*
|
|
||||||
* @ingroup ScoreSemaphore
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* COPYRIGHT (c) 1989-1999.
|
|
||||||
* On-Line Applications Research Corporation (OAR).
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.org/license/LICENSE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <rtems/score/coresemimpl.h>
|
|
||||||
|
|
||||||
CORE_semaphore_Status _CORE_semaphore_Surrender(
|
|
||||||
CORE_semaphore_Control *the_semaphore,
|
|
||||||
Objects_Id id,
|
|
||||||
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support,
|
|
||||||
ISR_lock_Context *lock_context
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Thread_Control *the_thread;
|
|
||||||
CORE_semaphore_Status status;
|
|
||||||
|
|
||||||
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
|
|
||||||
|
|
||||||
_Thread_queue_Acquire_critical( &the_semaphore->Wait_queue, lock_context );
|
|
||||||
|
|
||||||
the_thread = _Thread_queue_First_locked( &the_semaphore->Wait_queue );
|
|
||||||
if ( the_thread != NULL ) {
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
|
||||||
_Thread_Dispatch_disable();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_Thread_queue_Extract_critical(
|
|
||||||
&the_semaphore->Wait_queue,
|
|
||||||
the_thread,
|
|
||||||
lock_context
|
|
||||||
);
|
|
||||||
|
|
||||||
#if defined(RTEMS_MULTIPROCESSING)
|
|
||||||
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
|
|
||||||
(*api_semaphore_mp_support) ( the_thread, id );
|
|
||||||
|
|
||||||
_Thread_Dispatch_enable( _Per_CPU_Get() );
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
|
|
||||||
the_semaphore->count += 1;
|
|
||||||
else
|
|
||||||
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
|
|
||||||
|
|
||||||
_Thread_queue_Release( &the_semaphore->Wait_queue, lock_context );
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user