mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-28 06:33:13 +08:00
score: Create semaphore implementation header
Move implementation specific parts of coresem.h and coresem.inl into new header file coresemimpl.h. The coresem.h contains now only the application visible API.
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <rtems/posix/semaphore.h>
|
||||
#include <rtems/posix/posixapi.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <rtems/rtems/sem.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#include <rtems/rtems/options.h>
|
||||
#include <rtems/rtems/semimpl.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -26,6 +26,7 @@ include_rtems_score_HEADERS += include/rtems/score/coremsg.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/coremutex.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/coremuteximpl.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/coresem.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/coresemimpl.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/heap.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/protectedheap.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/interr.h
|
||||
@@ -88,7 +89,6 @@ include_rtems_score_HEADERS += inline/rtems/score/address.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/chain.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/corebarrier.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/coremsg.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/coresem.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/heap.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/object.inl
|
||||
include_rtems_score_HEADERS += inline/rtems/score/priority.inl
|
||||
|
||||
@@ -21,6 +21,12 @@
|
||||
#ifndef _RTEMS_SCORE_CORESEM_H
|
||||
#define _RTEMS_SCORE_CORESEM_H
|
||||
|
||||
#include <rtems/score/tqdata.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup ScoreSemaphore Semaphore Handler
|
||||
*
|
||||
@@ -31,28 +37,6 @@
|
||||
*/
|
||||
/**@{*/
|
||||
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
#include <rtems/score/priority.h>
|
||||
#include <rtems/score/watchdog.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(RTEMS_POSIX_API) || defined(RTEMS_MULTIPROCESSING)
|
||||
#define RTEMS_SCORE_CORESEM_ENABLE_SEIZE_BODY
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The following type defines the callout which the API provides
|
||||
* to support global/multiprocessor operations on semaphores.
|
||||
*/
|
||||
typedef void ( *CORE_semaphore_API_mp_support_callout )(
|
||||
Thread_Control *,
|
||||
Objects_Id
|
||||
);
|
||||
|
||||
/**
|
||||
* Blocking disciplines for a semaphore.
|
||||
*/
|
||||
@@ -65,39 +49,6 @@ typedef enum {
|
||||
CORE_SEMAPHORE_DISCIPLINES_PRIORITY
|
||||
} CORE_semaphore_Disciplines;
|
||||
|
||||
/**
|
||||
* Core Semaphore handler return statuses.
|
||||
*/
|
||||
typedef enum {
|
||||
/** This status indicates that the operation completed successfully. */
|
||||
CORE_SEMAPHORE_STATUS_SUCCESSFUL,
|
||||
/** This status indicates that the calling task did not want to block
|
||||
* and the operation was unable to complete immediately because the
|
||||
* resource was unavailable.
|
||||
*/
|
||||
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT,
|
||||
/** This status indicates that the thread was blocked waiting for an
|
||||
* operation to complete and the semaphore was deleted.
|
||||
*/
|
||||
CORE_SEMAPHORE_WAS_DELETED,
|
||||
/** This status indicates that the calling task was willing to block
|
||||
* but the operation was unable to complete within the time allotted
|
||||
* because the resource never became available.
|
||||
*/
|
||||
CORE_SEMAPHORE_TIMEOUT,
|
||||
/** This status indicates that an attempt was made to unlock the semaphore
|
||||
* and this would have made its count greater than that allowed.
|
||||
*/
|
||||
CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED
|
||||
} CORE_semaphore_Status;
|
||||
|
||||
/**
|
||||
* @brief Core semaphore last status value.
|
||||
*
|
||||
* This is the last status value.
|
||||
*/
|
||||
#define CORE_SEMAPHORE_STATUS_LAST CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED
|
||||
|
||||
/**
|
||||
* The following defines the control block used to manage the
|
||||
* attributes of each semaphore.
|
||||
@@ -128,101 +79,11 @@ typedef struct {
|
||||
uint32_t count;
|
||||
} CORE_semaphore_Control;
|
||||
|
||||
/**
|
||||
* @brief Initialize the semaphore based on the parameters passed.
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* This package is the implementation of the CORE Semaphore Handler.
|
||||
* This core object utilizes standard Dijkstra counting semaphores to provide
|
||||
* synchronization and mutual exclusion capabilities.
|
||||
*
|
||||
* This routine initializes the semaphore based on the parameters passed.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to initialize
|
||||
* @param[in] the_semaphore_attributes define the behavior of this instance
|
||||
* @param[in] initial_value is the initial count of the semaphore
|
||||
*/
|
||||
void _CORE_semaphore_Initialize(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
CORE_semaphore_Attributes *the_semaphore_attributes,
|
||||
uint32_t initial_value
|
||||
);
|
||||
|
||||
#if defined(RTEMS_SCORE_CORESEM_ENABLE_SEIZE_BODY)
|
||||
/**
|
||||
* This routine attempts to receive a unit from @a 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.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to seize
|
||||
* @param[in] id is the Id of the API level Semaphore object associated
|
||||
* with this instance of a SuperCore Semaphore
|
||||
* @param[in] wait indicates if the caller is willing to block
|
||||
* @param[in] timeout is the number of ticks the calling thread is willing
|
||||
* to wait if @a wait is true.
|
||||
*/
|
||||
void _CORE_semaphore_Seize(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
bool wait,
|
||||
Watchdog_Interval timeout
|
||||
);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Surrender a unit to a semaphore.
|
||||
*
|
||||
* This routine frees a unit to the semaphore. If a task was blocked waiting
|
||||
* for a unit from this semaphore, then that task will be readied and the unit
|
||||
* given to that task. Otherwise, the unit will be returned to the semaphore.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to surrender
|
||||
* @param[in] id is the Id of the API level Semaphore object associated
|
||||
* with this instance of a SuperCore Semaphore
|
||||
* @param[in] api_semaphore_mp_support is the routine to invoke if the
|
||||
* thread unblocked is remote
|
||||
*
|
||||
* @retval an indication of whether the routine succeeded or failed
|
||||
*/
|
||||
CORE_semaphore_Status _CORE_semaphore_Surrender(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Core semaphore flush.
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* This package is the implementation of the CORE Semaphore Handler.
|
||||
* This core object utilizes standard Dijkstra counting semaphores to provide
|
||||
* synchronization and mutual exclusion capabilities.
|
||||
*
|
||||
* This routine assists in the deletion of a semaphore by flushing the
|
||||
* associated wait queue.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to flush
|
||||
* @param[in] remote_extract_callout is the routine to invoke if the
|
||||
* thread unblocked is remote
|
||||
* @param[in] status is the status to be returned to the unblocked thread
|
||||
*/
|
||||
void _CORE_semaphore_Flush(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Thread_queue_Flush_callout remote_extract_callout,
|
||||
uint32_t status
|
||||
);
|
||||
|
||||
#ifndef __RTEMS_APPLICATION__
|
||||
#include <rtems/score/coresem.inl>
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**@}*/
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief Inlined Routines Associated with the SuperCore Semaphore
|
||||
*
|
||||
* This include file contains all of the inlined routines associated
|
||||
* with the SuperCore semaphore.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2006.
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_SCORE_CORESEMIMPL_H
|
||||
#define _RTEMS_SCORE_CORESEMIMPL_H
|
||||
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @addtogroup ScoreSemaphore
|
||||
*/
|
||||
/**@{**/
|
||||
|
||||
#if defined(RTEMS_POSIX_API) || defined(RTEMS_MULTIPROCESSING)
|
||||
#define RTEMS_SCORE_CORESEM_ENABLE_SEIZE_BODY
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Core Semaphore handler return statuses.
|
||||
*/
|
||||
typedef enum {
|
||||
/** This status indicates that the operation completed successfully. */
|
||||
CORE_SEMAPHORE_STATUS_SUCCESSFUL,
|
||||
/** This status indicates that the calling task did not want to block
|
||||
* and the operation was unable to complete immediately because the
|
||||
* resource was unavailable.
|
||||
*/
|
||||
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT,
|
||||
/** This status indicates that the thread was blocked waiting for an
|
||||
* operation to complete and the semaphore was deleted.
|
||||
*/
|
||||
CORE_SEMAPHORE_WAS_DELETED,
|
||||
/** This status indicates that the calling task was willing to block
|
||||
* but the operation was unable to complete within the time allotted
|
||||
* because the resource never became available.
|
||||
*/
|
||||
CORE_SEMAPHORE_TIMEOUT,
|
||||
/** This status indicates that an attempt was made to unlock the semaphore
|
||||
* and this would have made its count greater than that allowed.
|
||||
*/
|
||||
CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED
|
||||
} CORE_semaphore_Status;
|
||||
|
||||
/**
|
||||
* @brief Core semaphore last status value.
|
||||
*
|
||||
* This is the last status value.
|
||||
*/
|
||||
#define CORE_SEMAPHORE_STATUS_LAST CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED
|
||||
|
||||
/**
|
||||
* The following type defines the callout which the API provides
|
||||
* to support global/multiprocessor operations on semaphores.
|
||||
*/
|
||||
typedef void ( *CORE_semaphore_API_mp_support_callout )(
|
||||
Thread_Control *,
|
||||
Objects_Id
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Initialize the semaphore based on the parameters passed.
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* This package is the implementation of the CORE Semaphore Handler.
|
||||
* This core object utilizes standard Dijkstra counting semaphores to provide
|
||||
* synchronization and mutual exclusion capabilities.
|
||||
*
|
||||
* This routine initializes the semaphore based on the parameters passed.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to initialize
|
||||
* @param[in] the_semaphore_attributes define the behavior of this instance
|
||||
* @param[in] initial_value is the initial count of the semaphore
|
||||
*/
|
||||
void _CORE_semaphore_Initialize(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
CORE_semaphore_Attributes *the_semaphore_attributes,
|
||||
uint32_t initial_value
|
||||
);
|
||||
|
||||
#if defined(RTEMS_SCORE_CORESEM_ENABLE_SEIZE_BODY)
|
||||
/**
|
||||
* This routine attempts to receive a unit from @a 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.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to seize
|
||||
* @param[in] id is the Id of the API level Semaphore object associated
|
||||
* with this instance of a SuperCore Semaphore
|
||||
* @param[in] wait indicates if the caller is willing to block
|
||||
* @param[in] timeout is the number of ticks the calling thread is willing
|
||||
* to wait if @a wait is true.
|
||||
*/
|
||||
void _CORE_semaphore_Seize(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
bool wait,
|
||||
Watchdog_Interval timeout
|
||||
);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Surrender a unit to a semaphore.
|
||||
*
|
||||
* This routine frees a unit to the semaphore. If a task was blocked waiting
|
||||
* for a unit from this semaphore, then that task will be readied and the unit
|
||||
* given to that task. Otherwise, the unit will be returned to the semaphore.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to surrender
|
||||
* @param[in] id is the Id of the API level Semaphore object associated
|
||||
* with this instance of a SuperCore Semaphore
|
||||
* @param[in] api_semaphore_mp_support is the routine to invoke if the
|
||||
* thread unblocked is remote
|
||||
*
|
||||
* @retval an indication of whether the routine succeeded or failed
|
||||
*/
|
||||
CORE_semaphore_Status _CORE_semaphore_Surrender(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Objects_Id id,
|
||||
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Core semaphore flush.
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* This package is the implementation of the CORE Semaphore Handler.
|
||||
* This core object utilizes standard Dijkstra counting semaphores to provide
|
||||
* synchronization and mutual exclusion capabilities.
|
||||
*
|
||||
* This routine assists in the deletion of a semaphore by flushing the
|
||||
* associated wait queue.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to flush
|
||||
* @param[in] remote_extract_callout is the routine to invoke if the
|
||||
* thread unblocked is remote
|
||||
* @param[in] status is the status to be returned to the unblocked thread
|
||||
*/
|
||||
void _CORE_semaphore_Flush(
|
||||
CORE_semaphore_Control *the_semaphore,
|
||||
Thread_queue_Flush_callout remote_extract_callout,
|
||||
uint32_t status
|
||||
);
|
||||
|
||||
/**
|
||||
* This function returns true if the priority attribute is
|
||||
* enabled in the @a attribute_set and false otherwise.
|
||||
*
|
||||
* @param[in] the_attribute is the attribute set to test
|
||||
*
|
||||
* @return true if the priority attribute is enabled
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _CORE_semaphore_Is_priority(
|
||||
CORE_semaphore_Attributes *the_attribute
|
||||
)
|
||||
{
|
||||
return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine returns the current count associated with the semaphore.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to obtain the count of
|
||||
*
|
||||
* @return the current count of this semaphore
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE uint32_t _CORE_semaphore_Get_count(
|
||||
CORE_semaphore_Control *the_semaphore
|
||||
)
|
||||
{
|
||||
return the_semaphore->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to obtain
|
||||
* @param[in] id is the Id of the owning API level Semaphore object
|
||||
* @param[in] wait is true if the thread is willing to wait
|
||||
* @param[in] timeout is the maximum number of ticks to block
|
||||
* @param[in] level is a temporary variable used to contain the ISR
|
||||
* disable level cookie
|
||||
*
|
||||
* @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,
|
||||
bool wait,
|
||||
Watchdog_Interval timeout,
|
||||
ISR_Level level
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
|
||||
/* 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();
|
||||
_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();
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
@@ -1,118 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief Inlined Routines Associated with the SuperCore Semaphore
|
||||
*
|
||||
* This include file contains all of the inlined routines associated
|
||||
* with the SuperCore semaphore.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2006.
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_SCORE_CORESEM_H
|
||||
# error "Never use <rtems/score/coresem.inl> directly; include <rtems/score/coresem.h> instead."
|
||||
#endif
|
||||
|
||||
#ifndef _RTEMS_SCORE_CORESEM_INL
|
||||
#define _RTEMS_SCORE_CORESEM_INL
|
||||
|
||||
/**
|
||||
* @addtogroup ScoreSemaphore
|
||||
*/
|
||||
/**@{**/
|
||||
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
/**
|
||||
* This function returns true if the priority attribute is
|
||||
* enabled in the @a attribute_set and false otherwise.
|
||||
*
|
||||
* @param[in] the_attribute is the attribute set to test
|
||||
*
|
||||
* @return true if the priority attribute is enabled
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE bool _CORE_semaphore_Is_priority(
|
||||
CORE_semaphore_Attributes *the_attribute
|
||||
)
|
||||
{
|
||||
return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
|
||||
}
|
||||
|
||||
/**
|
||||
* This routine returns the current count associated with the semaphore.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to obtain the count of
|
||||
*
|
||||
* @return the current count of this semaphore
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE uint32_t _CORE_semaphore_Get_count(
|
||||
CORE_semaphore_Control *the_semaphore
|
||||
)
|
||||
{
|
||||
return the_semaphore->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param[in] the_semaphore is the semaphore to obtain
|
||||
* @param[in] id is the Id of the owning API level Semaphore object
|
||||
* @param[in] wait is true if the thread is willing to wait
|
||||
* @param[in] timeout is the maximum number of ticks to block
|
||||
* @param[in] level is a temporary variable used to contain the ISR
|
||||
* disable level cookie
|
||||
*
|
||||
* @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,
|
||||
bool wait,
|
||||
Watchdog_Interval timeout,
|
||||
ISR_Level level
|
||||
)
|
||||
{
|
||||
Thread_Control *executing;
|
||||
|
||||
/* 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();
|
||||
_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
|
||||
/* end of include file */
|
||||
@@ -87,6 +87,10 @@ $(PROJECT_INCLUDE)/rtems/score/coresem.h: include/rtems/score/coresem.h $(PROJEC
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/coresem.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/coresem.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/coresemimpl.h: include/rtems/score/coresemimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/coresemimpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/coresemimpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/heap.h: include/rtems/score/heap.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/heap.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/heap.h
|
||||
@@ -283,10 +287,6 @@ $(PROJECT_INCLUDE)/rtems/score/coremsg.inl: inline/rtems/score/coremsg.inl $(PRO
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/coremsg.inl
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/coremsg.inl
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/coresem.inl: inline/rtems/score/coresem.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/coresem.inl
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/coresem.inl
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/heap.inl: inline/rtems/score/heap.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/heap.inl
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/heap.inl
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/isr.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/isr.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/isr.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include <rtems/system.h>
|
||||
#include <rtems/score/isr.h>
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/score/states.h>
|
||||
#include <rtems/score/thread.h>
|
||||
#include <rtems/score/threadq.h>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include <rtems/score/watchdog.h>
|
||||
#include <rtems/score/sysstate.h>
|
||||
|
||||
#include <rtems/score/coresem.h>
|
||||
#include <rtems/score/coresemimpl.h>
|
||||
#include <rtems/config.h>
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
|
||||
Reference in New Issue
Block a user