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
|
||||
|
||||
## CORE_SEMAPHORE_C_FILES
|
||||
libscore_a_SOURCES += src/coresem.c \
|
||||
src/coresemsurrender.c
|
||||
libscore_a_SOURCES += src/coresem.c
|
||||
|
||||
## CORE_SPINLOCK_C_FILES
|
||||
if HAS_PTHREADS
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#define _RTEMS_SCORE_CORESEMIMPL_H
|
||||
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/objectimpl.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
#include <rtems/score/threadqimpl.h>
|
||||
#include <rtems/score/statesimpl.h>
|
||||
@@ -118,12 +119,49 @@ RTEMS_INLINE_ROUTINE void _CORE_semaphore_Destroy(
|
||||
*
|
||||
* @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,
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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