diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-24 13:50:54 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-26 11:55:47 +0200 |
commit | a2e3f33f39e6898c2e2886216fe671b29a93d643 (patch) | |
tree | d304dc7fe4fcf0dcb42a61b8ba99b2c698d8454f /cpukit/score | |
parent | Include missing <rtems/score/threaddispatch.h> (diff) | |
download | rtems-a2e3f33f39e6898c2e2886216fe671b29a93d643.tar.bz2 |
score: Create object implementation header
Move implementation specific parts of object.h and object.inl into new
header file objectimpl.h. The object.h contains now only the
application visible API.
Diffstat (limited to '')
48 files changed, 1090 insertions, 1225 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index f5710166eb..a5daa5cddc 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -37,6 +37,7 @@ include_rtems_score_HEADERS += include/rtems/score/isr.h include_rtems_score_HEADERS += include/rtems/score/isrlevel.h include_rtems_score_HEADERS += include/rtems/score/freechain.h include_rtems_score_HEADERS += include/rtems/score/object.h +include_rtems_score_HEADERS += include/rtems/score/objectimpl.h include_rtems_score_HEADERS += include/rtems/score/percpu.h include_rtems_score_HEADERS += include/rtems/score/priority.h include_rtems_score_HEADERS += include/rtems/score/prioritybitmap.h @@ -101,7 +102,6 @@ include_rtems_score_HEADERS += include/rtems/score/schedulersimplesmp.h endif ## inline -include_rtems_score_HEADERS += inline/rtems/score/object.inl include_rtems_score_HEADERS += inline/rtems/score/tod.inl ## src @@ -124,7 +124,7 @@ libscore_a_SOURCES += src/smp.c endif ## CORE_APIMUTEX_C_FILES -libscore_a_SOURCES += src/apimutex.c src/apimutexallocate.c \ +libscore_a_SOURCES += src/apimutex.c \ src/apimutexlock.c src/apimutexunlock.c ## CORE_BARRIER_C_FILES diff --git a/cpukit/score/include/rtems/score/apimutex.h b/cpukit/score/include/rtems/score/apimutex.h index 60c21ad29c..a34270ec08 100644 --- a/cpukit/score/include/rtems/score/apimutex.h +++ b/cpukit/score/include/rtems/score/apimutex.h @@ -18,9 +18,8 @@ #ifndef _RTEMS_SCORE_APIMUTEX_H #define _RTEMS_SCORE_APIMUTEX_H -#ifdef __cplusplus -extern "C" { -#endif +#include <rtems/score/coremutex.h> +#include <rtems/score/object.h> /** * @defgroup ScoreAPIMutex API Mutex Handler @@ -31,9 +30,9 @@ extern "C" { */ /**@{**/ -#include <rtems/score/coremutex.h> -#include <rtems/score/isr.h> -#include <rtems/score/object.h> +#ifdef __cplusplus +extern "C" { +#endif /** * @brief Control block used to manage each API mutex. @@ -51,11 +50,6 @@ typedef struct { } API_Mutex_Control; /** - * @brief Information control block used to manage this class of objects. - */ -SCORE_EXTERN Objects_Information _API_Mutex_Information; - -/** * @brief Initialization for the API Mutexe Handler. * * The value @a maximum_mutexes is the maximum number of API mutexes that may diff --git a/cpukit/score/include/rtems/score/object.h b/cpukit/score/include/rtems/score/object.h index d6b8f48d35..f06342facb 100644 --- a/cpukit/score/include/rtems/score/object.h +++ b/cpukit/score/include/rtems/score/object.h @@ -20,18 +20,8 @@ #ifndef _RTEMS_SCORE_OBJECT_H #define _RTEMS_SCORE_OBJECT_H +#include <rtems/score/basedefs.h> #include <rtems/score/chain.h> -#include <rtems/score/isr.h> - -#if defined(RTEMS_POSIX_API) - /** - * This macro is defined when an API is enabled that requires the - * use of strings for object names. Since the Classic API uses - * 32-bit unsigned integers and not strings, this allows us to - * disable this in the smallest RTEMS configuratinos. - */ - #define RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES -#endif #ifdef __cplusplus extern "C" { @@ -44,6 +34,16 @@ extern "C" { */ /**@{*/ +#if defined(RTEMS_POSIX_API) + /** + * This macro is defined when an API is enabled that requires the + * use of strings for object names. Since the Classic API uses + * 32-bit unsigned integers and not strings, this allows us to + * disable this in the smallest RTEMS configuratinos. + */ + #define RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES +#endif + /** * @defgroup ScoreCPU CPU Architecture Support * @@ -73,15 +73,6 @@ typedef union { uint32_t name_u32; } Objects_Name; -/** - * Functions which compare names are prototyped like this. - */ -typedef bool (*Objects_Name_comparators)( - void * /* name_1 */, - void * /* name_2 */, - uint16_t /* length */ -); - #if defined(RTEMS_USE_16_BIT_OBJECT) /** * The following type defines the control block used to manage @@ -229,86 +220,6 @@ typedef enum { OBJECTS_POSIX_API = 3 } Objects_APIs; -/** This macro is used to generically specify the last API index. */ -#define OBJECTS_APIS_LAST OBJECTS_POSIX_API - -/** - * This enumerated type is used in the class field of the object ID - * for RTEMS internal object classes. - */ -typedef enum { - OBJECTS_INTERNAL_NO_CLASS = 0, - OBJECTS_INTERNAL_THREADS = 1, - OBJECTS_INTERNAL_MUTEXES = 2 -} Objects_Internal_API; - -/** This macro is used to generically specify the last API index. */ -#define OBJECTS_INTERNAL_CLASSES_LAST OBJECTS_INTERNAL_MUTEXES - -/** - * This enumerated type is used in the class field of the object ID - * for the RTEMS Classic API. - */ -typedef enum { - OBJECTS_CLASSIC_NO_CLASS = 0, - OBJECTS_RTEMS_TASKS = 1, - OBJECTS_RTEMS_TIMERS = 2, - OBJECTS_RTEMS_SEMAPHORES = 3, - OBJECTS_RTEMS_MESSAGE_QUEUES = 4, - OBJECTS_RTEMS_PARTITIONS = 5, - OBJECTS_RTEMS_REGIONS = 6, - OBJECTS_RTEMS_PORTS = 7, - OBJECTS_RTEMS_PERIODS = 8, - OBJECTS_RTEMS_EXTENSIONS = 9, - OBJECTS_RTEMS_BARRIERS = 10 -} Objects_Classic_API; - -/** This macro is used to generically specify the last API index. */ -#define OBJECTS_RTEMS_CLASSES_LAST OBJECTS_RTEMS_BARRIERS - -/** - * This enumerated type is used in the class field of the object ID - * for the POSIX API. - */ -typedef enum { - OBJECTS_POSIX_NO_CLASS = 0, - OBJECTS_POSIX_THREADS = 1, - OBJECTS_POSIX_KEYS = 2, - OBJECTS_POSIX_INTERRUPTS = 3, - OBJECTS_POSIX_MESSAGE_QUEUE_FDS = 4, - OBJECTS_POSIX_MESSAGE_QUEUES = 5, - OBJECTS_POSIX_MUTEXES = 6, - OBJECTS_POSIX_SEMAPHORES = 7, - OBJECTS_POSIX_CONDITION_VARIABLES = 8, - OBJECTS_POSIX_TIMERS = 9, - OBJECTS_POSIX_BARRIERS = 10, - OBJECTS_POSIX_SPINLOCKS = 11, - OBJECTS_POSIX_RWLOCKS = 12 -} Objects_POSIX_API; - -/** This macro is used to generically specify the last API index. */ -#define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_RWLOCKS - -/** - * This enumerated type lists the locations which may be returned - * by _Objects_Get. These codes indicate the success of locating - * an object with the specified ID. - */ -typedef enum { -#if defined(RTEMS_MULTIPROCESSING) - OBJECTS_REMOTE = 2, /* object is remote */ -#endif - OBJECTS_LOCAL = 0, /* object is local */ - OBJECTS_ERROR = 1 /* id was invalid */ -} Objects_Locations; - -/** - * The following type defines the callout used when a local task - * is extracted from a remote thread queue (i.e. it's proxy must - * extracted from the remote queue). - */ -typedef void ( *Objects_Thread_queue_Extract_callout )( void * ); - /** * The following defines the Object Control Block used to manage * each object local to this node. @@ -323,77 +234,6 @@ typedef struct { } Objects_Control; /** - * The following defines the structure for the information used to - * manage each class of objects. - */ -typedef struct { - /** This field indicates the API of this object class. */ - Objects_APIs the_api; - /** This is the class of this object set. */ - uint16_t the_class; - /** This is the minimum valid id of this object class. */ - Objects_Id minimum_id; - /** This is the maximum valid id of this object class. */ - Objects_Id maximum_id; - /** This is the maximum number of objects in this class. */ - Objects_Maximum maximum; - /** This is the true if unlimited objects in this class. */ - bool auto_extend; - /** This is the number of objects in a block. */ - Objects_Maximum allocation_size; - /** This is the size in bytes of each object instance. */ - size_t size; - /** This points to the table of local objects. */ - Objects_Control **local_table; - /** This is the chain of inactive control blocks. */ - Chain_Control Inactive; - /** This is the number of objects on the Inactive list. */ - Objects_Maximum inactive; - /** This is the number of inactive objects per block. */ - uint32_t *inactive_per_block; - /** This is a table to the chain of inactive object memory blocks. */ - void **object_blocks; - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /** This is true if names are strings. */ - bool is_string; - #endif - /** This is the maximum length of names. */ - uint16_t name_length; - /** This is this object class' method called when extracting a thread. */ - Objects_Thread_queue_Extract_callout extract; - #if defined(RTEMS_MULTIPROCESSING) - /** This is this object class' pointer to the global name table */ - Chain_Control *global_table; - #endif -} Objects_Information; - -/** - * The following is referenced to the node number of the local node. - */ -#if defined(RTEMS_MULTIPROCESSING) -SCORE_EXTERN uint16_t _Objects_Local_node; -#else -#define _Objects_Local_node ((uint16_t)1) -#endif - -/** - * The following is referenced to the number of nodes in the system. - */ -#if defined(RTEMS_MULTIPROCESSING) -SCORE_EXTERN uint16_t _Objects_Maximum_nodes; -#else -#define _Objects_Maximum_nodes 1 -#endif - -/** - * The following is the list of information blocks per API for each object - * class. From the ID, we can go to one of these information blocks, - * and obtain a pointer to the appropriate object control block. - */ -SCORE_EXTERN Objects_Information - **_Objects_Information_table[OBJECTS_APIS_LAST + 1]; - -/** * No object can have this ID. */ #define OBJECTS_ID_NONE 0 @@ -441,105 +281,6 @@ SCORE_EXTERN Objects_Information #define OBJECTS_ID_FINAL ((Objects_Id)~0) /** - * This function extends an object class information record. - * - * @param[in] information points to an object class information block. - */ -void _Objects_Extend_information( - Objects_Information *information -); - -/** - * @brief Shrink an object class information record - * - * This function shrink an object class information record. - * The object's name and object space are released. The local_table - * etc block does not shrink. The InActive list needs to be scanned - * to find the objects are remove them. - * - * @param[in] information points to an object class information block. - */ -void _Objects_Shrink_information( - Objects_Information *information -); - -/** - * @brief Initialize object Information - * - * This function initializes an object class information record. - * SUPPORTS_GLOBAL is true if the object class supports global - * objects, and false otherwise. Maximum indicates the number - * of objects required in this class and size indicates the size - * in bytes of each control block for this object class. The - * name length and string designator are also set. In addition, - * the class may be a task, therefore this information is also included. - * - * @param[in] information points to an object class information block. - * @param[in] the_api indicates the API associated with this information block. - * @param[in] the_class indicates the class of object being managed - * by this information block. It is specific to @a the_api. - * @param[in] maximum is the maximum number of instances of this object - * class which may be concurrently active. - * @param[in] size is the size of the data structure for this class. - * @param[in] is_string is true if this object uses string style names. - * @param[in] maximum_name_length is the maximum length of object names. - */ -void _Objects_Initialize_information ( - Objects_Information *information, - Objects_APIs the_api, - uint16_t the_class, - uint32_t maximum, - uint16_t size, - bool is_string, - uint32_t maximum_name_length -#if defined(RTEMS_MULTIPROCESSING) - , - bool supports_global, - Objects_Thread_queue_Extract_callout extract -#endif -); - -/** - * @brief Object API Maximum Class - * - * This function returns the highest numeric value of a valid - * API for the specified @a api. - * - * @param[in] api is the API of interest - * - * @retval A positive integer on success and 0 otherwise. - */ -unsigned int _Objects_API_maximum_class( - uint32_t api -); - -/** - * @brief Allocate an object. - * - * This function allocates an object control block from - * the inactive chain of free object control blocks. - * - * @param[in] information points to an object class information block. - */ -Objects_Control *_Objects_Allocate( - Objects_Information *information -); - -/** - * @brief Free an object. - * - * This function frees an object control block to the - * inactive chain of free object control blocks. - * - * @param[in] information points to an object class information block. - * @param[in] the_object points to the object to deallocate. - */ -void _Objects_Free( - Objects_Information *information, - Objects_Control *the_object -); - -/** * This macro is used to build a thirty-two bit style name from * four characters. The most significant byte will be the * character @a _C1. @@ -556,344 +297,104 @@ void _Objects_Free( (uint32_t)(_C4) ) /** - * This function implements the common portion of the object - * identification directives. This directive returns the object - * id associated with name. If more than one object of this class - * is named name, then the object to which the id belongs is - * arbitrary. Node indicates the extent of the search for the - * id of the object named name. If the object class supports global - * objects, then the search can be limited to a particular node - * or allowed to encompass all nodes. - */ -typedef enum { - OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL, - OBJECTS_INVALID_NAME, - OBJECTS_INVALID_ADDRESS, - OBJECTS_INVALID_ID, - OBJECTS_INVALID_NODE -} Objects_Name_or_id_lookup_errors; - -/** - * This macro defines the first entry in the - * @ref Objects_Name_or_id_lookup_errors enumerated list. - */ -#define OBJECTS_NAME_ERRORS_FIRST OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL - -/** - * This macro defines the last entry in the - * @ref Objects_Name_or_id_lookup_errors enumerated list. - */ -#define OBJECTS_NAME_ERRORS_LAST OBJECTS_INVALID_NODE - -/** - * @brief Converts an object name to an Id. - * - * This method converts an object name to an Id. It performs a look up - * using the object information block for this object class. - * - * @param[in] information points to an object class information block. - * @param[in] name is the name of the object to find. - * @param[in] node is the set of nodes to search. - * @param[in] id will contain the Id if the search is successful. - * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a id will contain the Id of - * the requested object. - */ -Objects_Name_or_id_lookup_errors _Objects_Name_to_id_u32( - Objects_Information *information, - uint32_t name, - uint32_t node, - Objects_Id *id -); - -#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) -/** - * @brief Converts an object name to an Id. - * - * This method converts an object name to an Id. It performs a look up - * using the object information block for this object class. - * - * @param[in] information points to an object class information block. - * @param[in] name is the name of the object to find. - * @param[in] id will contain the Id if the search is successful. - * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a id will contain the Id of - * the requested object. - */ -Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string( - Objects_Information *information, - const char *name, - Objects_Id *id -); -#endif - -/** - * @brief Implements the common portion of the object Id to name directives. - * - * This function implements the common portion of the object Id - * to name directives. This function returns the name - * associated with object id. - * - * @param[in] id is the Id of the object whose name we are locating. - * @param[in] name will contain the name of the object, if found. - * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a name will contain the name of - * the requested object. - * - * @note This function currently does not support string names. - */ -Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( - Objects_Id id, - Objects_Name *name -); - -/** - * @brief Maps object ids to object control blocks. - * - * This function maps object ids to object control blocks. - * If id corresponds to a local object, then it returns - * the_object control pointer which maps to id and location - * is set to OBJECTS_LOCAL. If the object class supports global - * objects and the object id is global and resides on a remote - * node, then location is set to OBJECTS_REMOTE, and the_object - * is undefined. Otherwise, location is set to OBJECTS_ERROR - * and the_object is undefined. - * - * @param[in] information points to an object class information block. - * @param[in] id is the Id of the object whose name we are locating. - * @param[in] location will contain an indication of success or failure. - * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a id will contain the Id of - * the requested object. - * - * @note _Objects_Get returns with dispatching disabled for - * local and remote objects. _Objects_Get_isr_disable returns with - * dispatching disabled for remote objects and interrupts for local - * objects. - */ -Objects_Control *_Objects_Get ( - Objects_Information *information, - Objects_Id id, - Objects_Locations *location -); - -/** - * @brief Maps object ids to object control blocks. - * - * This function maps object ids to object control blocks. - * If id corresponds to a local object, then it returns - * the_object control pointer which maps to id and location - * is set to OBJECTS_LOCAL. If the object class supports global - * objects and the object id is global and resides on a remote - * node, then location is set to OBJECTS_REMOTE, and the_object - * is undefined. Otherwise, location is set to OBJECTS_ERROR - * and the_object is undefined. - * - * @param[in] information points to an object class information block. - * @param[in] id is the Id of the object whose name we are locating. - * @param[in] location will contain an indication of success or failure. - * @param[in] level is the interrupt level being turned. - * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a name will contain the name of - * the requested object. - * - * @note _Objects_Get returns with dispatching disabled for - * local and remote objects. _Objects_Get_isr_disable returns with - * dispatchng disabled for remote objects and interrupts for local - * objects. - */ -Objects_Control *_Objects_Get_isr_disable( - Objects_Information *information, - Objects_Id id, - Objects_Locations *location, - ISR_Level *level -); - -/** - * @brief Maps object ids to object control blocks. - * - * This function maps object ids to object control blocks. - * If id corresponds to a local object, then it returns - * the_object control pointer which maps to id and location - * is set to OBJECTS_LOCAL. If the object class supports global - * objects and the object id is global and resides on a remote - * node, then location is set to OBJECTS_REMOTE, and the_object - * is undefined. Otherwise, location is set to OBJECTS_ERROR - * and the_object is undefined. - * - * @param[in] information points to an object class information block. - * @param[in] id is the Id of the object whose name we are locating. - * @param[in] location will contain an indication of success or failure. + * This function returns the API portion of the ID. * - * @retval This method returns one of the values from the - * @ref Objects_Name_or_id_lookup_errors enumeration to indicate - * successful or failure. On success @a id will contain the Id of - * the requested object. + * @param[in] id is the object Id to be processed. * - * @note _Objects_Get returns with dispatching disabled for - * local and remote objects. _Objects_Get_isr_disable returns with - * dispatching disabled for remote objects and interrupts for local - * objects. + * @return This method returns an object Id constructed from the arguments. */ -Objects_Control *_Objects_Get_no_protection( - Objects_Information *information, - Objects_Id id, - Objects_Locations *location -); - -/** - * Like @ref _Objects_Get, but is used to find "next" open object. - * - * @param[in] information points to an object class information block. - * @param[in] id is the Id of the object whose name we are locating. - * @param[in] location_p will contain an indication of success or failure. - * @param[in] next_id_p is the Id of the next object we will look at. - * - * @retval This method returns the pointer to the object located or - * NULL on error. - */ -Objects_Control *_Objects_Get_next( - Objects_Information *information, - Objects_Id id, - Objects_Locations *location_p, - Objects_Id *next_id_p -); - -/** - * @brief Get object information. - * - * This function return the information structure given - * an the API and Class. This can be done independent of - * the existence of any objects created by the API. - * - * @param[in] the_api indicates the API for the information we want - * @param[in] the_class indicates the Class for the information we want - * - * @retval This method returns a pointer to the Object Information Table - * for the class of objects which corresponds to this object ID. - */ -Objects_Information *_Objects_Get_information( - Objects_APIs the_api, - uint16_t the_class -); - -/** - * @brief Get information of an object from an ID. - * - * This function return the information structure given - * an @a id of an object. - * - * @param[in] id is the object ID to get the information from - * - * @retval This method returns a pointer to the Object Information Table - * for the class of objects which corresponds to this object ID. - */ -Objects_Information *_Objects_Get_information_id( - Objects_Id id -); - -/** - * @brief Gets object name in the form of a C string. - * - * This method objects the name of an object and returns its name - * in the form of a C string. It attempts to be careful about - * overflowing the user's string and about returning unprintable characters. - * - * @param[in] id is the object to obtain the name of - * @param[in] length indicates the length of the caller's buffer - * @param[in] name points a string which will be filled in. - * - * @retval This method returns @a name or NULL on error. @a *name will - * contain the name if successful. - */ -char *_Objects_Get_name_as_string( - Objects_Id id, - size_t length, - char *name -); +RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( + Objects_Id id +) +{ + return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); +} /** - * @brief Set objects name. - * - * This method sets the object name to either a copy of a string - * or up to the first four characters of the string based upon - * whether this object class uses strings for names. - * - * @param[in] information points to the object information structure - * @param[in] the_object is the object to operate upon - * @param[in] name is a pointer to the name to use + * This function returns the class portion of the ID. * - * @retval If successful, true is returned. Otherwise false is returned. + * @param[in] id is the object Id to be processed */ -bool _Objects_Set_name( - Objects_Information *information, - Objects_Control *the_object, - const char *name -); +RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class( + Objects_Id id +) +{ + return (uint32_t) + ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS); +} /** - * @brief Removes object from namespace. + * This function returns the node portion of the ID. * - * This function removes @a the_object from the namespace. + * @param[in] id is the object Id to be processed * - * @param[in] information points to an Object Information Table. - * @param[in] the_object is a pointer to an object. + * @return This method returns the node portion of an object ID. */ -void _Objects_Namespace_remove( - Objects_Information *information, - Objects_Control *the_object -); +RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_node( + Objects_Id id +) +{ + /* + * If using 16-bit Ids, then there is no node field and it MUST + * be a single processor system. + */ + #if defined(RTEMS_USE_16_BIT_OBJECT) + return 1; + #else + return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS; + #endif +} /** - * @brief Close object. + * This function returns the index portion of the ID. * - * This function removes the_object control pointer and object name - * in the Local Pointer and Local Name Tables. + * @param[in] id is the Id to be processed * - * @param[in] information points to an Object Information Table - * @param[in] the_object is a pointer to an object + * @return This method returns the class portion of the specified object ID. */ -void _Objects_Close( - Objects_Information *information, - Objects_Control *the_object -); +RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_index( + Objects_Id id +) +{ + return + (Objects_Maximum)((id >> OBJECTS_INDEX_START_BIT) & + OBJECTS_INDEX_VALID_BITS); +} /** - * @brief Returns the count of active objects. - * - * @param[in] information The object information table. - * - * @retval The count of active objects. - */ -Objects_Maximum _Objects_Active_count( - const Objects_Information *information -); - -/* - * Pieces of object.inl are promoted out to the user - */ + * This function builds an object's id from the processor node and index + * values specified. + * + * @param[in] the_api indicates the API associated with this Id. + * @param[in] the_class indicates the class of object. + * It is specific to @a the_api. + * @param[in] node is the node where this object resides. + * @param[in] index is the instance number of this object. + * + * @return This method returns an object Id constructed from the arguments. + */ +RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id( + Objects_APIs the_api, + uint32_t the_class, + uint32_t node, + uint32_t index +) +{ + return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | + (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | + #if !defined(RTEMS_USE_16_BIT_OBJECT) + (( (Objects_Id) node ) << OBJECTS_NODE_START_BIT) | + #endif + (( (Objects_Id) index ) << OBJECTS_INDEX_START_BIT); +} -#include <rtems/score/object.inl> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif +/**@}*/ +/**@}*/ +/**@}*/ #ifdef __cplusplus } #endif -/**@}*/ -/**@}*/ -/**@}*/ #endif /* end of include file */ diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h new file mode 100644 index 0000000000..742145387c --- /dev/null +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -0,0 +1,930 @@ +/** + * @file + * + * @brief Inlined Routines in the Object Handler + * + * This include file contains the static inline implementation of all + * of the inlined routines in the Object Handler. + */ + +/* + * COPYRIGHT (c) 1989-2011. + * 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_OBJECTIMPL_H +#define _RTEMS_SCORE_OBJECTIMPL_H + +#include <rtems/score/object.h> +#include <rtems/score/isrlevel.h> +#include <rtems/score/threaddispatch.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup ScoreObject + * + * @{ + */ + +/** + * Functions which compare names are prototyped like this. + */ +typedef bool (*Objects_Name_comparators)( + void * /* name_1 */, + void * /* name_2 */, + uint16_t /* length */ +); + +/** This macro is used to generically specify the last API index. */ +#define OBJECTS_APIS_LAST OBJECTS_POSIX_API + +/** + * This enumerated type is used in the class field of the object ID + * for RTEMS internal object classes. + */ +typedef enum { + OBJECTS_INTERNAL_NO_CLASS = 0, + OBJECTS_INTERNAL_THREADS = 1, + OBJECTS_INTERNAL_MUTEXES = 2 +} Objects_Internal_API; + +/** This macro is used to generically specify the last API index. */ +#define OBJECTS_INTERNAL_CLASSES_LAST OBJECTS_INTERNAL_MUTEXES + +/** + * This enumerated type is used in the class field of the object ID + * for the RTEMS Classic API. + */ +typedef enum { + OBJECTS_CLASSIC_NO_CLASS = 0, + OBJECTS_RTEMS_TASKS = 1, + OBJECTS_RTEMS_TIMERS = 2, + OBJECTS_RTEMS_SEMAPHORES = 3, + OBJECTS_RTEMS_MESSAGE_QUEUES = 4, + OBJECTS_RTEMS_PARTITIONS = 5, + OBJECTS_RTEMS_REGIONS = 6, + OBJECTS_RTEMS_PORTS = 7, + OBJECTS_RTEMS_PERIODS = 8, + OBJECTS_RTEMS_EXTENSIONS = 9, + OBJECTS_RTEMS_BARRIERS = 10 +} Objects_Classic_API; + +/** This macro is used to generically specify the last API index. */ +#define OBJECTS_RTEMS_CLASSES_LAST OBJECTS_RTEMS_BARRIERS + +/** + * This enumerated type is used in the class field of the object ID + * for the POSIX API. + */ +typedef enum { + OBJECTS_POSIX_NO_CLASS = 0, + OBJECTS_POSIX_THREADS = 1, + OBJECTS_POSIX_KEYS = 2, + OBJECTS_POSIX_INTERRUPTS = 3, + OBJECTS_POSIX_MESSAGE_QUEUE_FDS = 4, + OBJECTS_POSIX_MESSAGE_QUEUES = 5, + OBJECTS_POSIX_MUTEXES = 6, + OBJECTS_POSIX_SEMAPHORES = 7, + OBJECTS_POSIX_CONDITION_VARIABLES = 8, + OBJECTS_POSIX_TIMERS = 9, + OBJECTS_POSIX_BARRIERS = 10, + OBJECTS_POSIX_SPINLOCKS = 11, + OBJECTS_POSIX_RWLOCKS = 12 +} Objects_POSIX_API; + +/** This macro is used to generically specify the last API index. */ +#define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_RWLOCKS + +/** + * This enumerated type lists the locations which may be returned + * by _Objects_Get. These codes indicate the success of locating + * an object with the specified ID. + */ +typedef enum { +#if defined(RTEMS_MULTIPROCESSING) + OBJECTS_REMOTE = 2, /* object is remote */ +#endif + OBJECTS_LOCAL = 0, /* object is local */ + OBJECTS_ERROR = 1 /* id was invalid */ +} Objects_Locations; + +/** + * The following type defines the callout used when a local task + * is extracted from a remote thread queue (i.e. it's proxy must + * extracted from the remote queue). + */ +typedef void ( *Objects_Thread_queue_Extract_callout )( void * ); + +/** + * The following defines the structure for the information used to + * manage each class of objects. + */ +typedef struct { + /** This field indicates the API of this object class. */ + Objects_APIs the_api; + /** This is the class of this object set. */ + uint16_t the_class; + /** This is the minimum valid id of this object class. */ + Objects_Id minimum_id; + /** This is the maximum valid id of this object class. */ + Objects_Id maximum_id; + /** This is the maximum number of objects in this class. */ + Objects_Maximum maximum; + /** This is the true if unlimited objects in this class. */ + bool auto_extend; + /** This is the number of objects in a block. */ + Objects_Maximum allocation_size; + /** This is the size in bytes of each object instance. */ + size_t size; + /** This points to the table of local objects. */ + Objects_Control **local_table; + /** This is the chain of inactive control blocks. */ + Chain_Control Inactive; + /** This is the number of objects on the Inactive list. */ + Objects_Maximum inactive; + /** This is the number of inactive objects per block. */ + uint32_t *inactive_per_block; + /** This is a table to the chain of inactive object memory blocks. */ + void **object_blocks; + #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) + /** This is true if names are strings. */ + bool is_string; + #endif + /** This is the maximum length of names. */ + uint16_t name_length; + /** This is this object class' method called when extracting a thread. */ + Objects_Thread_queue_Extract_callout extract; + #if defined(RTEMS_MULTIPROCESSING) + /** This is this object class' pointer to the global name table */ + Chain_Control *global_table; + #endif +} Objects_Information; + +/** + * The following is referenced to the node number of the local node. + */ +#if defined(RTEMS_MULTIPROCESSING) +SCORE_EXTERN uint16_t _Objects_Local_node; +#else +#define _Objects_Local_node ((uint16_t)1) +#endif + +/** + * The following is referenced to the number of nodes in the system. + */ +#if defined(RTEMS_MULTIPROCESSING) +SCORE_EXTERN uint16_t _Objects_Maximum_nodes; +#else +#define _Objects_Maximum_nodes 1 +#endif + +/** + * The following is the list of information blocks per API for each object + * class. From the ID, we can go to one of these information blocks, + * and obtain a pointer to the appropriate object control block. + */ +SCORE_EXTERN Objects_Information + **_Objects_Information_table[OBJECTS_APIS_LAST + 1]; + +/** + * This function extends an object class information record. + * + * @param[in] information points to an object class information block. + */ +void _Objects_Extend_information( + Objects_Information *information +); + +/** + * @brief Shrink an object class information record + * + * This function shrink an object class information record. + * The object's name and object space are released. The local_table + * etc block does not shrink. The InActive list needs to be scanned + * to find the objects are remove them. + * + * @param[in] information points to an object class information block. + */ +void _Objects_Shrink_information( + Objects_Information *information +); + +/** + * @brief Initialize object Information + * + * This function initializes an object class information record. + * SUPPORTS_GLOBAL is true if the object class supports global + * objects, and false otherwise. Maximum indicates the number + * of objects required in this class and size indicates the size + * in bytes of each control block for this object class. The + * name length and string designator are also set. In addition, + * the class may be a task, therefore this information is also included. + * + * @param[in] information points to an object class information block. + * @param[in] the_api indicates the API associated with this information block. + * @param[in] the_class indicates the class of object being managed + * by this information block. It is specific to @a the_api. + * @param[in] maximum is the maximum number of instances of this object + * class which may be concurrently active. + * @param[in] size is the size of the data structure for this class. + * @param[in] is_string is true if this object uses string style names. + * @param[in] maximum_name_length is the maximum length of object names. + */ +void _Objects_Initialize_information ( + Objects_Information *information, + Objects_APIs the_api, + uint16_t the_class, + uint32_t maximum, + uint16_t size, + bool is_string, + uint32_t maximum_name_length +#if defined(RTEMS_MULTIPROCESSING) + , + bool supports_global, + Objects_Thread_queue_Extract_callout extract +#endif +); + +/** + * @brief Object API Maximum Class + * + * This function returns the highest numeric value of a valid + * API for the specified @a api. + * + * @param[in] api is the API of interest + * + * @retval A positive integer on success and 0 otherwise. + */ +unsigned int _Objects_API_maximum_class( + uint32_t api +); + +/** + * @brief Allocate an object. + * + * This function allocates an object control block from + * the inactive chain of free object control blocks. + * + * @param[in] information points to an object class information block. + */ +Objects_Control *_Objects_Allocate( + Objects_Information *information +); + +/** + * @brief Free an object. + * + * This function frees an object control block to the + * inactive chain of free object control blocks. + * + * @param[in] information points to an object class information block. + * @param[in] the_object points to the object to deallocate. + */ +void _Objects_Free( + Objects_Information *information, + Objects_Control *the_object +); + +/** + * This function implements the common portion of the object + * identification directives. This directive returns the object + * id associated with name. If more than one object of this class + * is named name, then the object to which the id belongs is + * arbitrary. Node indicates the extent of the search for the + * id of the object named name. If the object class supports global + * objects, then the search can be limited to a particular node + * or allowed to encompass all nodes. + */ +typedef enum { + OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL, + OBJECTS_INVALID_NAME, + OBJECTS_INVALID_ADDRESS, + OBJECTS_INVALID_ID, + OBJECTS_INVALID_NODE +} Objects_Name_or_id_lookup_errors; + +/** + * This macro defines the first entry in the + * @ref Objects_Name_or_id_lookup_errors enumerated list. + */ +#define OBJECTS_NAME_ERRORS_FIRST OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL + +/** + * This macro defines the last entry in the + * @ref Objects_Name_or_id_lookup_errors enumerated list. + */ +#define OBJECTS_NAME_ERRORS_LAST OBJECTS_INVALID_NODE + +/** + * @brief Converts an object name to an Id. + * + * This method converts an object name to an Id. It performs a look up + * using the object information block for this object class. + * + * @param[in] information points to an object class information block. + * @param[in] name is the name of the object to find. + * @param[in] node is the set of nodes to search. + * @param[in] id will contain the Id if the search is successful. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a id will contain the Id of + * the requested object. + */ +Objects_Name_or_id_lookup_errors _Objects_Name_to_id_u32( + Objects_Information *information, + uint32_t name, + uint32_t node, + Objects_Id *id +); + +#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) +/** + * @brief Converts an object name to an Id. + * + * This method converts an object name to an Id. It performs a look up + * using the object information block for this object class. + * + * @param[in] information points to an object class information block. + * @param[in] name is the name of the object to find. + * @param[in] id will contain the Id if the search is successful. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a id will contain the Id of + * the requested object. + */ +Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string( + Objects_Information *information, + const char *name, + Objects_Id *id +); +#endif + +/** + * @brief Implements the common portion of the object Id to name directives. + * + * This function implements the common portion of the object Id + * to name directives. This function returns the name + * associated with object id. + * + * @param[in] id is the Id of the object whose name we are locating. + * @param[in] name will contain the name of the object, if found. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a name will contain the name of + * the requested object. + * + * @note This function currently does not support string names. + */ +Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( + Objects_Id id, + Objects_Name *name +); + +/** + * @brief Maps object ids to object control blocks. + * + * This function maps object ids to object control blocks. + * If id corresponds to a local object, then it returns + * the_object control pointer which maps to id and location + * is set to OBJECTS_LOCAL. If the object class supports global + * objects and the object id is global and resides on a remote + * node, then location is set to OBJECTS_REMOTE, and the_object + * is undefined. Otherwise, location is set to OBJECTS_ERROR + * and the_object is undefined. + * + * @param[in] information points to an object class information block. + * @param[in] id is the Id of the object whose name we are locating. + * @param[in] location will contain an indication of success or failure. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a id will contain the Id of + * the requested object. + * + * @note _Objects_Get returns with dispatching disabled for + * local and remote objects. _Objects_Get_isr_disable returns with + * dispatching disabled for remote objects and interrupts for local + * objects. + */ +Objects_Control *_Objects_Get ( + Objects_Information *information, + Objects_Id id, + Objects_Locations *location +); + +/** + * @brief Maps object ids to object control blocks. + * + * This function maps object ids to object control blocks. + * If id corresponds to a local object, then it returns + * the_object control pointer which maps to id and location + * is set to OBJECTS_LOCAL. If the object class supports global + * objects and the object id is global and resides on a remote + * node, then location is set to OBJECTS_REMOTE, and the_object + * is undefined. Otherwise, location is set to OBJECTS_ERROR + * and the_object is undefined. + * + * @param[in] information points to an object class information block. + * @param[in] id is the Id of the object whose name we are locating. + * @param[in] location will contain an indication of success or failure. + * @param[in] level is the interrupt level being turned. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a name will contain the name of + * the requested object. + * + * @note _Objects_Get returns with dispatching disabled for + * local and remote objects. _Objects_Get_isr_disable returns with + * dispatchng disabled for remote objects and interrupts for local + * objects. + */ +Objects_Control *_Objects_Get_isr_disable( + Objects_Information *information, + Objects_Id id, + Objects_Locations *location, + ISR_Level *level +); + +/** + * @brief Maps object ids to object control blocks. + * + * This function maps object ids to object control blocks. + * If id corresponds to a local object, then it returns + * the_object control pointer which maps to id and location + * is set to OBJECTS_LOCAL. If the object class supports global + * objects and the object id is global and resides on a remote + * node, then location is set to OBJECTS_REMOTE, and the_object + * is undefined. Otherwise, location is set to OBJECTS_ERROR + * and the_object is undefined. + * + * @param[in] information points to an object class information block. + * @param[in] id is the Id of the object whose name we are locating. + * @param[in] location will contain an indication of success or failure. + * + * @retval This method returns one of the values from the + * @ref Objects_Name_or_id_lookup_errors enumeration to indicate + * successful or failure. On success @a id will contain the Id of + * the requested object. + * + * @note _Objects_Get returns with dispatching disabled for + * local and remote objects. _Objects_Get_isr_disable returns with + * dispatching disabled for remote objects and interrupts for local + * objects. + */ +Objects_Control *_Objects_Get_no_protection( + Objects_Information *information, + Objects_Id id, + Objects_Locations *location +); + +/** + * Like @ref _Objects_Get, but is used to find "next" open object. + * + * @param[in] information points to an object class information block. + * @param[in] id is the Id of the object whose name we are locating. + * @param[in] location_p will contain an indication of success or failure. + * @param[in] next_id_p is the Id of the next object we will look at. + * + * @retval This method returns the pointer to the object located or + * NULL on error. + */ +Objects_Control *_Objects_Get_next( + Objects_Information *information, + Objects_Id id, + Objects_Locations *location_p, + Objects_Id *next_id_p +); + +/** + * @brief Get object information. + * + * This function return the information structure given + * an the API and Class. This can be done independent of + * the existence of any objects created by the API. + * + * @param[in] the_api indicates the API for the information we want + * @param[in] the_class indicates the Class for the information we want + * + * @retval This method returns a pointer to the Object Information Table + * for the class of objects which corresponds to this object ID. + */ +Objects_Information *_Objects_Get_information( + Objects_APIs the_api, + uint16_t the_class +); + +/** + * @brief Get information of an object from an ID. + * + * This function return the information structure given + * an @a id of an object. + * + * @param[in] id is the object ID to get the information from + * + * @retval This method returns a pointer to the Object Information Table + * for the class of objects which corresponds to this object ID. + */ +Objects_Information *_Objects_Get_information_id( + Objects_Id id +); + +/** + * @brief Gets object name in the form of a C string. + * + * This method objects the name of an object and returns its name + * in the form of a C string. It attempts to be careful about + * overflowing the user's string and about returning unprintable characters. + * + * @param[in] id is the object to obtain the name of + * @param[in] length indicates the length of the caller's buffer + * @param[in] name points a string which will be filled in. + * + * @retval This method returns @a name or NULL on error. @a *name will + * contain the name if successful. + */ +char *_Objects_Get_name_as_string( + Objects_Id id, + size_t length, + char *name +); + +/** + * @brief Set objects name. + * + * This method sets the object name to either a copy of a string + * or up to the first four characters of the string based upon + * whether this object class uses strings for names. + * + * @param[in] information points to the object information structure + * @param[in] the_object is the object to operate upon + * @param[in] name is a pointer to the name to use + * + * @retval If successful, true is returned. Otherwise false is returned. + */ +bool _Objects_Set_name( + Objects_Information *information, + Objects_Control *the_object, + const char *name +); + +/** + * @brief Removes object from namespace. + * + * This function removes @a the_object from the namespace. + * + * @param[in] information points to an Object Information Table. + * @param[in] the_object is a pointer to an object. + */ +void _Objects_Namespace_remove( + Objects_Information *information, + Objects_Control *the_object +); + +/** + * @brief Close object. + * + * This function removes the_object control pointer and object name + * in the Local Pointer and Local Name Tables. + * + * @param[in] information points to an Object Information Table + * @param[in] the_object is a pointer to an object + */ +void _Objects_Close( + Objects_Information *information, + Objects_Control *the_object +); + +/** + * @brief Returns the count of active objects. + * + * @param[in] information The object information table. + * + * @retval The count of active objects. + */ +Objects_Maximum _Objects_Active_count( + const Objects_Information *information +); + +/** + * This function returns true if the api is valid. + * + * @param[in] the_api is the api portion of an object ID. + * + * @return This method returns true if the specified api value is valid + * and false otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( + uint32_t the_api +) +{ + if ( !the_api || the_api > OBJECTS_APIS_LAST ) + return false; + return true; +} + +/** + * This function returns true if the node is of the local object, and + * false otherwise. + * + * @param[in] node is the node number and corresponds to the node number + * portion of an object ID. + * + * @return This method returns true if the specified node is the local node + * and false otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Objects_Is_local_node( + uint32_t node +) +{ + return ( node == _Objects_Local_node ); +} + +/** + * This function returns true if the id is of a local object, and + * false otherwise. + * + * @param[in] id is an object ID + * + * @return This method returns true if the specified object Id is local + * and false otherwise. + * + * @note On a single processor configuration, this always returns true. + */ +RTEMS_INLINE_ROUTINE bool _Objects_Is_local_id( +#if defined(RTEMS_MULTIPROCESSING) + Objects_Id id +#else + Objects_Id id __attribute__((unused)) +#endif +) +{ +#if defined(RTEMS_MULTIPROCESSING) + return _Objects_Is_local_node( _Objects_Get_node(id) ); +#else + return true; +#endif +} + +/** + * This function returns true if left and right are equal, + * and false otherwise. + * + * @param[in] left is the Id on the left hand side of the comparison + * @param[in] right is the Id on the right hand side of the comparison + * + * @return This method returns true if the specified object IDs are equal + * and false otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Objects_Are_ids_equal( + Objects_Id left, + Objects_Id right +) +{ + return ( left == right ); +} + +/** + * This function returns a pointer to the local_table object + * referenced by the index. + * + * @param[in] information points to an Object Information Table + * @param[in] index is the index of the object the caller wants to access + * + * @return This method returns a pointer to a local object or NULL if the + * index is invalid and RTEMS_DEBUG is enabled. + */ +RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Get_local_object( + Objects_Information *information, + uint16_t index +) +{ + /* + * This routine is ONLY to be called from places in the code + * where the Id is known to be good. Therefore, this should NOT + * occur in normal situations. + */ + #if defined(RTEMS_DEBUG) + if ( index > information->maximum ) + return NULL; + #endif + return information->local_table[ index ]; +} + +/** + * This function sets the pointer to the local_table object + * referenced by the index. + * + * @param[in] information points to an Object Information Table + * @param[in] index is the index of the object the caller wants to access + * @param[in] the_object is the local object pointer + * + * @note This routine is ONLY to be called in places where the + * index portion of the Id is known to be good. This is + * OK since it is normally called from object create/init + * or delete/destroy operations. + */ + +RTEMS_INLINE_ROUTINE void _Objects_Set_local_object( + Objects_Information *information, + uint32_t index, + Objects_Control *the_object +) +{ + /* + * This routine is ONLY to be called from places in the code + * where the Id is known to be good. Therefore, this should NOT + * occur in normal situations. + */ + #if defined(RTEMS_DEBUG) + if ( index > information->maximum ) + return; + #endif + + information->local_table[ index ] = the_object; +} + +/** + * This function sets the pointer to the local_table object + * referenced by the index to a NULL so the object Id is invalid + * after this call. + * + * @param[in] information points to an Object Information Table + * @param[in] the_object is the local object pointer + * + * @note This routine is ONLY to be called in places where the + * index portion of the Id is known to be good. This is + * OK since it is normally called from object create/init + * or delete/destroy operations. + */ + +RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id( + Objects_Information *information, + Objects_Control *the_object +) +{ + _Objects_Set_local_object( + information, + _Objects_Get_index( the_object->id ), + NULL + ); +} + +/** + * This function places the_object control pointer and object name + * in the Local Pointer and Local Name Tables, respectively. + * + * @param[in] information points to an Object Information Table + * @param[in] the_object is a pointer to an object + * @param[in] name is the name of the object to make accessible + */ +RTEMS_INLINE_ROUTINE void _Objects_Open( + Objects_Information *information, + Objects_Control *the_object, + Objects_Name name +) +{ + _Objects_Set_local_object( + information, + _Objects_Get_index( the_object->id ), + the_object + ); + + the_object->name = name; +} + +/** + * This function places the_object control pointer and object name + * in the Local Pointer and Local Name Tables, respectively. + * + * @param[in] information points to an Object Information Table + * @param[in] the_object is a pointer to an object + * @param[in] name is the name of the object to make accessible + */ +RTEMS_INLINE_ROUTINE void _Objects_Open_u32( + Objects_Information *information, + Objects_Control *the_object, + uint32_t name +) +{ + _Objects_Set_local_object( + information, + _Objects_Get_index( the_object->id ), + the_object + ); + + /* ASSERT: information->is_string == false */ + the_object->name.name_u32 = name; +} + +/** + * This function places the_object control pointer and object name + * in the Local Pointer and Local Name Tables, respectively. + * + * @param[in] information points to an Object Information Table + * @param[in] the_object is a pointer to an object + * @param[in] name is the name of the object to make accessible + */ +RTEMS_INLINE_ROUTINE void _Objects_Open_string( + Objects_Information *information, + Objects_Control *the_object, + const char *name +) +{ + _Objects_Set_local_object( + information, + _Objects_Get_index( the_object->id ), + the_object + ); + + #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) + /* ASSERT: information->is_string */ + the_object->name.name_p = name; + #endif +} + +/** + * Returns if the object maximum specifies unlimited objects. + * + * @param[in] maximum The object maximum specification. + * + * @retval true Unlimited objects are available. + * @retval false The object count is fixed. + */ +RTEMS_INLINE_ROUTINE bool _Objects_Is_unlimited( uint32_t maximum ) +{ + return (maximum & OBJECTS_UNLIMITED_OBJECTS) != 0; +} + +/* + * We cannot use an inline function for this since it may be evaluated at + * compile time. + */ +#define _Objects_Maximum_per_allocation( maximum ) \ + ((Objects_Maximum) ((maximum) & ~OBJECTS_UNLIMITED_OBJECTS)) + +/** + * @brief Puts back an object obtained with _Objects_Get(). + * + * This function decrements the thread dispatch disable level. The + * _Thread_Dispatch() is called if the level reaches zero. + */ +RTEMS_INLINE_ROUTINE void _Objects_Put( + Objects_Control *the_object +) +{ + (void) the_object; + _Thread_Enable_dispatch(); +} + +/** + * @brief Puts back an object obtained with _Objects_Get(). + * + * This function decrements the thread dispatch disable level. The + * _Thread_Dispatch() is not called if the level reaches zero, thus a thread + * dispatch will not take place immediately on the current processor. + */ +RTEMS_INLINE_ROUTINE void _Objects_Put_without_thread_dispatch( + Objects_Control *the_object +) +{ + (void) the_object; + _Thread_Unnest_dispatch(); +} + +/** + * @brief Puts back an object obtained with _Objects_Get_isr_disable(). + */ +RTEMS_INLINE_ROUTINE void _Objects_Put_for_get_isr_disable( + Objects_Control *the_object +) +{ + (void) the_object; +#if defined(RTEMS_SMP) + _Thread_Enable_dispatch(); +#endif +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#if defined(RTEMS_MULTIPROCESSING) +#include <rtems/score/objectmp.h> +#endif + + +#endif +/* end of include file */ diff --git a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h index 6215015102..8a8917ca1b 100644 --- a/cpukit/score/include/rtems/score/schedulerpriorityimpl.h +++ b/cpukit/score/include/rtems/score/schedulerpriorityimpl.h @@ -23,6 +23,7 @@ #include <rtems/score/schedulerpriority.h> #include <rtems/score/chainimpl.h> #include <rtems/score/prioritybitmapimpl.h> +#include <rtems/score/thread.h> #include <rtems/score/wkspace.h> #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index 339ccd806e..0496a7a802 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -20,6 +20,7 @@ #define _RTEMS_SCORE_THREADIMPL_H #include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/statesimpl.h> #ifdef __cplusplus diff --git a/cpukit/score/inline/rtems/score/object.inl b/cpukit/score/inline/rtems/score/object.inl deleted file mode 100644 index bab5f984e3..0000000000 --- a/cpukit/score/inline/rtems/score/object.inl +++ /dev/null @@ -1,421 +0,0 @@ -/** - * @file - * - * @brief Inlined Routines in the Object Handler - * - * This include file contains the static inline implementation of all - * of the inlined routines in the Object Handler. - */ - -/* - * COPYRIGHT (c) 1989-2011. - * 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_OBJECT_H -# error "Never use <rtems/score/object.inl> directly; include <rtems/score/object.h> instead." -#endif - -#ifndef _RTEMS_SCORE_OBJECT_INL -#define _RTEMS_SCORE_OBJECT_INL - -#include <rtems/score/threaddispatch.h> - -/** - * This function builds an object's id from the processor node and index - * values specified. - * - * @param[in] the_api indicates the API associated with this Id. - * @param[in] the_class indicates the class of object. - * It is specific to @a the_api. - * @param[in] node is the node where this object resides. - * @param[in] index is the instance number of this object. - * - * @return This method returns an object Id constructed from the arguments. - */ -RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id( - Objects_APIs the_api, - uint32_t the_class, - uint32_t node, - uint32_t index -) -{ - return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | - (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | - #if !defined(RTEMS_USE_16_BIT_OBJECT) - (( (Objects_Id) node ) << OBJECTS_NODE_START_BIT) | - #endif - (( (Objects_Id) index ) << OBJECTS_INDEX_START_BIT); -} - -/** - * This function returns the API portion of the ID. - * - * @param[in] id is the object Id to be processed. - * - * @return This method returns an object Id constructed from the arguments. - */ -RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( - Objects_Id id -) -{ - return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); -} - -/** - * This function returns the class portion of the ID. - * - * @param[in] id is the object Id to be processed - */ -RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class( - Objects_Id id -) -{ - return (uint32_t) - ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS); -} - -/** - * This function returns the node portion of the ID. - * - * @param[in] id is the object Id to be processed - * - * @return This method returns the node portion of an object ID. - */ -RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_node( - Objects_Id id -) -{ - /* - * If using 16-bit Ids, then there is no node field and it MUST - * be a single processor system. - */ - #if defined(RTEMS_USE_16_BIT_OBJECT) - return 1; - #else - return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS; - #endif -} - -/** - * This function returns the index portion of the ID. - * - * @param[in] id is the Id to be processed - * - * @return This method returns the class portion of the specified object ID. - */ -RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_index( - Objects_Id id -) -{ - return - (Objects_Maximum)((id >> OBJECTS_INDEX_START_BIT) & - OBJECTS_INDEX_VALID_BITS); -} - -/** - * This function returns true if the api is valid. - * - * @param[in] the_api is the api portion of an object ID. - * - * @return This method returns true if the specified api value is valid - * and false otherwise. - */ -RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( - uint32_t the_api -) -{ - if ( !the_api || the_api > OBJECTS_APIS_LAST ) - return false; - return true; -} - -/** - * This function returns true if the node is of the local object, and - * false otherwise. - * - * @param[in] node is the node number and corresponds to the node number - * portion of an object ID. - * - * @return This method returns true if the specified node is the local node - * and false otherwise. - */ -RTEMS_INLINE_ROUTINE bool _Objects_Is_local_node( - uint32_t node -) -{ - return ( node == _Objects_Local_node ); -} - -/** - * This function returns true if the id is of a local object, and - * false otherwise. - * - * @param[in] id is an object ID - * - * @return This method returns true if the specified object Id is local - * and false otherwise. - * - * @note On a single processor configuration, this always returns true. - */ -RTEMS_INLINE_ROUTINE bool _Objects_Is_local_id( -#if defined(RTEMS_MULTIPROCESSING) - Objects_Id id -#else - Objects_Id id __attribute__((unused)) -#endif -) -{ -#if defined(RTEMS_MULTIPROCESSING) - return _Objects_Is_local_node( _Objects_Get_node(id) ); -#else - return true; -#endif -} - -/** - * This function returns true if left and right are equal, - * and false otherwise. - * - * @param[in] left is the Id on the left hand side of the comparison - * @param[in] right is the Id on the right hand side of the comparison - * - * @return This method returns true if the specified object IDs are equal - * and false otherwise. - */ -RTEMS_INLINE_ROUTINE bool _Objects_Are_ids_equal( - Objects_Id left, - Objects_Id right -) -{ - return ( left == right ); -} - -/** - * This function returns a pointer to the local_table object - * referenced by the index. - * - * @param[in] information points to an Object Information Table - * @param[in] index is the index of the object the caller wants to access - * - * @return This method returns a pointer to a local object or NULL if the - * index is invalid and RTEMS_DEBUG is enabled. - */ -RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Get_local_object( - Objects_Information *information, - uint16_t index -) -{ - /* - * This routine is ONLY to be called from places in the code - * where the Id is known to be good. Therefore, this should NOT - * occur in normal situations. - */ - #if defined(RTEMS_DEBUG) - if ( index > information->maximum ) - return NULL; - #endif - return information->local_table[ index ]; -} - -/** - * This function sets the pointer to the local_table object - * referenced by the index. - * - * @param[in] information points to an Object Information Table - * @param[in] index is the index of the object the caller wants to access - * @param[in] the_object is the local object pointer - * - * @note This routine is ONLY to be called in places where the - * index portion of the Id is known to be good. This is - * OK since it is normally called from object create/init - * or delete/destroy operations. - */ - -RTEMS_INLINE_ROUTINE void _Objects_Set_local_object( - Objects_Information *information, - uint32_t index, - Objects_Control *the_object -) -{ - /* - * This routine is ONLY to be called from places in the code - * where the Id is known to be good. Therefore, this should NOT - * occur in normal situations. - */ - #if defined(RTEMS_DEBUG) - if ( index > information->maximum ) - return; - #endif - - information->local_table[ index ] = the_object; -} - -/** - * This function sets the pointer to the local_table object - * referenced by the index to a NULL so the object Id is invalid - * after this call. - * - * @param[in] information points to an Object Information Table - * @param[in] the_object is the local object pointer - * - * @note This routine is ONLY to be called in places where the - * index portion of the Id is known to be good. This is - * OK since it is normally called from object create/init - * or delete/destroy operations. - */ - -RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id( - Objects_Information *information, - Objects_Control *the_object -) -{ - _Objects_Set_local_object( - information, - _Objects_Get_index( the_object->id ), - NULL - ); -} - -/** - * This function places the_object control pointer and object name - * in the Local Pointer and Local Name Tables, respectively. - * - * @param[in] information points to an Object Information Table - * @param[in] the_object is a pointer to an object - * @param[in] name is the name of the object to make accessible - */ -RTEMS_INLINE_ROUTINE void _Objects_Open( - Objects_Information *information, - Objects_Control *the_object, - Objects_Name name -) -{ - _Objects_Set_local_object( - information, - _Objects_Get_index( the_object->id ), - the_object - ); - - the_object->name = name; -} - -/** - * This function places the_object control pointer and object name - * in the Local Pointer and Local Name Tables, respectively. - * - * @param[in] information points to an Object Information Table - * @param[in] the_object is a pointer to an object - * @param[in] name is the name of the object to make accessible - */ -RTEMS_INLINE_ROUTINE void _Objects_Open_u32( - Objects_Information *information, - Objects_Control *the_object, - uint32_t name -) -{ - _Objects_Set_local_object( - information, - _Objects_Get_index( the_object->id ), - the_object - ); - - /* ASSERT: information->is_string == false */ - the_object->name.name_u32 = name; -} - -/** - * This function places the_object control pointer and object name - * in the Local Pointer and Local Name Tables, respectively. - * - * @param[in] information points to an Object Information Table - * @param[in] the_object is a pointer to an object - * @param[in] name is the name of the object to make accessible - */ -RTEMS_INLINE_ROUTINE void _Objects_Open_string( - Objects_Information *information, - Objects_Control *the_object, - const char *name -) -{ - _Objects_Set_local_object( - information, - _Objects_Get_index( the_object->id ), - the_object - ); - - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /* ASSERT: information->is_string */ - the_object->name.name_p = name; - #endif -} - -/** - * Returns if the object maximum specifies unlimited objects. - * - * @param[in] maximum The object maximum specification. - * - * @retval true Unlimited objects are available. - * @retval false The object count is fixed. - */ -RTEMS_INLINE_ROUTINE bool _Objects_Is_unlimited( uint32_t maximum ) -{ - return (maximum & OBJECTS_UNLIMITED_OBJECTS) != 0; -} - -/* - * We cannot use an inline function for this since it may be evaluated at - * compile time. - */ -#define _Objects_Maximum_per_allocation( maximum ) \ - ((Objects_Maximum) ((maximum) & ~OBJECTS_UNLIMITED_OBJECTS)) - -#endif - -/** - * @brief Puts back an object obtained with _Objects_Get(). - * - * This function decrements the thread dispatch disable level. The - * _Thread_Dispatch() is called if the level reaches zero. - */ -RTEMS_INLINE_ROUTINE void _Objects_Put( - Objects_Control *the_object -) -{ - (void) the_object; - _Thread_Enable_dispatch(); -} - -/** - * @brief Puts back an object obtained with _Objects_Get(). - * - * This function decrements the thread dispatch disable level. The - * _Thread_Dispatch() is not called if the level reaches zero, thus a thread - * dispatch will not take place immediately on the current processor. - */ -RTEMS_INLINE_ROUTINE void _Objects_Put_without_thread_dispatch( - Objects_Control *the_object -) -{ - (void) the_object; - _Thread_Unnest_dispatch(); -} - -/** - * @brief Puts back an object obtained with _Objects_Get_isr_disable(). - */ -RTEMS_INLINE_ROUTINE void _Objects_Put_for_get_isr_disable( - Objects_Control *the_object -) -{ - (void) the_object; -#if defined(RTEMS_SMP) - _Thread_Enable_dispatch(); -#endif -} - -/* end of include file */ diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am index 2ba6c86f73..42e2dbf828 100644 --- a/cpukit/score/preinstall.am +++ b/cpukit/score/preinstall.am @@ -131,6 +131,10 @@ $(PROJECT_INCLUDE)/rtems/score/object.h: include/rtems/score/object.h $(PROJECT_ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.h +$(PROJECT_INCLUDE)/rtems/score/objectimpl.h: include/rtems/score/objectimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/objectimpl.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/objectimpl.h + $(PROJECT_INCLUDE)/rtems/score/percpu.h: include/rtems/score/percpu.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/percpu.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/percpu.h @@ -335,10 +339,6 @@ $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h: include/rtems/score/schedul $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h endif -$(PROJECT_INCLUDE)/rtems/score/object.inl: inline/rtems/score/object.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.inl -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.inl - $(PROJECT_INCLUDE)/rtems/score/tod.inl: inline/rtems/score/tod.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/tod.inl PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/tod.inl diff --git a/cpukit/score/src/apimutex.c b/cpukit/score/src/apimutex.c index bc72c91e7c..555292d539 100644 --- a/cpukit/score/src/apimutex.c +++ b/cpukit/score/src/apimutex.c @@ -1,7 +1,7 @@ /** * @file - * - * @brief Initialization for the API Mutexe Handler. + * + * @brief Initialization and Allocation for API Mutex Handler * * @ingroup ScoreAPIMutex */ @@ -19,8 +19,11 @@ #include "config.h" #endif -#include <rtems/system.h> #include <rtems/score/apimutex.h> +#include <rtems/score/coremuteximpl.h> +#include <rtems/score/objectimpl.h> + +static Objects_Information _API_Mutex_Information; void _API_Mutex_Initialization( uint32_t maximum_mutexes @@ -41,3 +44,25 @@ void _API_Mutex_Initialization( #endif ); } + +void _API_Mutex_Allocate( + API_Mutex_Control **the_mutex +) +{ + API_Mutex_Control *mutex; + + CORE_mutex_Attributes attr = { + CORE_MUTEX_NESTING_ACQUIRES, + false, + CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT, + 0 + }; + + mutex = (API_Mutex_Control *) _Objects_Allocate( &_API_Mutex_Information ); + + _CORE_mutex_Initialize( &mutex->Mutex, NULL, &attr, CORE_MUTEX_UNLOCKED ); + + _Objects_Open_u32( &_API_Mutex_Information, &mutex->Object, 1 ); + + *the_mutex = mutex; +} diff --git a/cpukit/score/src/apimutexallocate.c b/cpukit/score/src/apimutexallocate.c deleted file mode 100644 index c57cc66e6b..0000000000 --- a/cpukit/score/src/apimutexallocate.c +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file - * - * @brief Allocates an API Mutex from the Inactive Set - * @ingroup ScoreAPIMutex - */ - -/* - * COPYRIGHT (c) 1989-2007. - * 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. - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems/system.h> -#include <rtems/score/apimutex.h> -#include <rtems/score/coremuteximpl.h> - -void _API_Mutex_Allocate( - API_Mutex_Control **the_mutex -) -{ - API_Mutex_Control *mutex; - - CORE_mutex_Attributes attr = { - CORE_MUTEX_NESTING_ACQUIRES, - false, - CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT, - 0 - }; - - mutex = (API_Mutex_Control *) _Objects_Allocate( &_API_Mutex_Information ); - - _CORE_mutex_Initialize( &mutex->Mutex, NULL, &attr, CORE_MUTEX_UNLOCKED ); - - _Objects_Open_u32( &_API_Mutex_Information, &mutex->Object, 1 ); - - *the_mutex = mutex; -} diff --git a/cpukit/score/src/corebarrierrelease.c b/cpukit/score/src/corebarrierrelease.c index 818d1718cb..f39e72d9fa 100644 --- a/cpukit/score/src/corebarrierrelease.c +++ b/cpukit/score/src/corebarrierrelease.c @@ -20,6 +20,7 @@ #endif #include <rtems/score/corebarrierimpl.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/threadqimpl.h> uint32_t _CORE_barrier_Release( diff --git a/cpukit/score/src/coremsgbroadcast.c b/cpukit/score/src/coremsgbroadcast.c index d860eb11a8..595305cbb1 100644 --- a/cpukit/score/src/coremsgbroadcast.c +++ b/cpukit/score/src/coremsgbroadcast.c @@ -18,13 +18,9 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/chain.h> -#include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> CORE_message_queue_Status _CORE_message_queue_Broadcast( CORE_message_queue_Control *the_message_queue, diff --git a/cpukit/score/src/coremsgclose.c b/cpukit/score/src/coremsgclose.c index 946a4f5653..9f63e1314b 100644 --- a/cpukit/score/src/coremsgclose.c +++ b/cpukit/score/src/coremsgclose.c @@ -21,7 +21,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsgflush.c b/cpukit/score/src/coremsgflush.c index 169b1472f7..c6aefeb166 100644 --- a/cpukit/score/src/coremsgflush.c +++ b/cpukit/score/src/coremsgflush.c @@ -21,7 +21,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsgflushsupp.c b/cpukit/score/src/coremsgflushsupp.c index 436e77f2c6..0fb4718298 100644 --- a/cpukit/score/src/coremsgflushsupp.c +++ b/cpukit/score/src/coremsgflushsupp.c @@ -22,7 +22,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsgflushwait.c b/cpukit/score/src/coremsgflushwait.c index 4355239497..ab238509b4 100644 --- a/cpukit/score/src/coremsgflushwait.c +++ b/cpukit/score/src/coremsgflushwait.c @@ -22,7 +22,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsginsert.c b/cpukit/score/src/coremsginsert.c index fca5f07150..509512e0fd 100644 --- a/cpukit/score/src/coremsginsert.c +++ b/cpukit/score/src/coremsginsert.c @@ -21,7 +21,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsgseize.c b/cpukit/score/src/coremsgseize.c index 24d6f573a2..b3280bf755 100644 --- a/cpukit/score/src/coremsgseize.c +++ b/cpukit/score/src/coremsgseize.c @@ -21,7 +21,6 @@ #include <rtems/system.h> #include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> #include <rtems/score/thread.h> #include <rtems/score/wkspace.h> diff --git a/cpukit/score/src/coremsgsubmit.c b/cpukit/score/src/coremsgsubmit.c index 09982dc2a5..b0b4833640 100644 --- a/cpukit/score/src/coremsgsubmit.c +++ b/cpukit/score/src/coremsgsubmit.c @@ -19,12 +19,9 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/chain.h> -#include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/coremsgimpl.h> -#include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> +#include <rtems/score/isr.h> #include <rtems/score/wkspace.h> CORE_message_queue_Status _CORE_message_queue_Submit( diff --git a/cpukit/score/src/coresemsurrender.c b/cpukit/score/src/coresemsurrender.c index 58a39299a2..caae4b15c9 100644 --- a/cpukit/score/src/coresemsurrender.c +++ b/cpukit/score/src/coresemsurrender.c @@ -19,10 +19,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/isr.h> #include <rtems/score/coresemimpl.h> -#include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> CORE_semaphore_Status _CORE_semaphore_Surrender( CORE_semaphore_Control *the_semaphore, diff --git a/cpukit/score/src/coretod.c b/cpukit/score/src/coretod.c index 0cde95bbbe..2f664b4b45 100644 --- a/cpukit/score/src/coretod.c +++ b/cpukit/score/src/coretod.c @@ -19,7 +19,6 @@ #endif #include <rtems/system.h> -#include <rtems/score/object.h> #include <rtems/score/thread.h> #include <rtems/score/tod.h> #include <rtems/score/watchdog.h> diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c index 3bf5e52de5..5c5e9c452c 100644 --- a/cpukit/score/src/coretodset.c +++ b/cpukit/score/src/coretodset.c @@ -19,7 +19,6 @@ #endif #include <rtems/system.h> -#include <rtems/score/object.h> #include <rtems/score/thread.h> #include <rtems/score/threaddispatch.h> #include <rtems/score/timestamp.h> diff --git a/cpukit/score/src/coretodtickle.c b/cpukit/score/src/coretodtickle.c index 4f53befe8d..d55c054a82 100644 --- a/cpukit/score/src/coretodtickle.c +++ b/cpukit/score/src/coretodtickle.c @@ -19,7 +19,6 @@ #endif #include <rtems/system.h> -#include <rtems/score/object.h> #include <rtems/score/thread.h> #include <rtems/score/timestamp.h> #include <rtems/score/tod.h> diff --git a/cpukit/score/src/iterateoverthreads.c b/cpukit/score/src/iterateoverthreads.c index 78e769bb00..de2c5befde 100644 --- a/cpukit/score/src/iterateoverthreads.c +++ b/cpukit/score/src/iterateoverthreads.c @@ -18,8 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> #include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { diff --git a/cpukit/score/src/objectactivecount.c b/cpukit/score/src/objectactivecount.c index 2cfa56aefb..3abc27fa9e 100644 --- a/cpukit/score/src/objectactivecount.c +++ b/cpukit/score/src/objectactivecount.c @@ -16,7 +16,7 @@ #include "config.h" #endif -#include <rtems/score/object.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/chainimpl.h> Objects_Maximum _Objects_Active_count( diff --git a/cpukit/score/src/objectallocate.c b/cpukit/score/src/objectallocate.c index 6d1818229d..d07b7b90e3 100644 --- a/cpukit/score/src/objectallocate.c +++ b/cpukit/score/src/objectallocate.c @@ -18,16 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/chainimpl.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> /* #define RTEMS_DEBUG_OBJECT_ALLOCATION */ diff --git a/cpukit/score/src/objectapimaximumclass.c b/cpukit/score/src/objectapimaximumclass.c index 4cd54d8efe..9d718fc576 100644 --- a/cpukit/score/src/objectapimaximumclass.c +++ b/cpukit/score/src/objectapimaximumclass.c @@ -18,8 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> +#include <rtems/score/objectimpl.h> unsigned int _Objects_API_maximum_class( uint32_t api diff --git a/cpukit/score/src/objectclose.c b/cpukit/score/src/objectclose.c index e669504782..55d76b0782 100644 --- a/cpukit/score/src/objectclose.c +++ b/cpukit/score/src/objectclose.c @@ -18,9 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> -#include <rtems/score/wkspace.h> +#include <rtems/score/objectimpl.h> void _Objects_Close( Objects_Information *information, diff --git a/cpukit/score/src/objectextendinformation.c b/cpukit/score/src/objectextendinformation.c index 96b26f3f3a..c9f874ea89 100644 --- a/cpukit/score/src/objectextendinformation.c +++ b/cpukit/score/src/objectextendinformation.c @@ -18,16 +18,11 @@ #include "config.h" #endif -#include <rtems/system.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/address.h> #include <rtems/score/chainimpl.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> +#include <rtems/score/isrlevel.h> #include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> #include <string.h> /* for memcpy() */ diff --git a/cpukit/score/src/objectfree.c b/cpukit/score/src/objectfree.c index d6861118c9..0bfffb9d84 100644 --- a/cpukit/score/src/objectfree.c +++ b/cpukit/score/src/objectfree.c @@ -18,16 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/chainimpl.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> void _Objects_Free( Objects_Information *information, diff --git a/cpukit/score/src/objectget.c b/cpukit/score/src/objectget.c index 5d05cc83a2..2da1295697 100644 --- a/cpukit/score/src/objectget.c +++ b/cpukit/score/src/objectget.c @@ -18,16 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <rtems/score/objectimpl.h> Objects_Control *_Objects_Get( Objects_Information *information, diff --git a/cpukit/score/src/objectgetinfo.c b/cpukit/score/src/objectgetinfo.c index 3955acc3ca..8b4a26b07b 100644 --- a/cpukit/score/src/objectgetinfo.c +++ b/cpukit/score/src/objectgetinfo.c @@ -18,10 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> +#include <rtems/score/objectimpl.h> Objects_Information *_Objects_Get_information( Objects_APIs the_api, diff --git a/cpukit/score/src/objectgetinfoid.c b/cpukit/score/src/objectgetinfoid.c index b6b13534b4..29e02bcc0f 100644 --- a/cpukit/score/src/objectgetinfoid.c +++ b/cpukit/score/src/objectgetinfoid.c @@ -19,9 +19,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> -#include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> Objects_Information *_Objects_Get_information_id( Objects_Id id diff --git a/cpukit/score/src/objectgetisr.c b/cpukit/score/src/objectgetisr.c index a7073842ac..651037feda 100644 --- a/cpukit/score/src/objectgetisr.c +++ b/cpukit/score/src/objectgetisr.c @@ -18,16 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <rtems/score/objectimpl.h> Objects_Control *_Objects_Get_isr_disable( Objects_Information *information, diff --git a/cpukit/score/src/objectgetnameasstring.c b/cpukit/score/src/objectgetnameasstring.c index 2e2c18ee6b..c7906a08b6 100644 --- a/cpukit/score/src/objectgetnameasstring.c +++ b/cpukit/score/src/objectgetnameasstring.c @@ -19,7 +19,6 @@ #include "config.h" #endif -#include <rtems/score/object.h> #include <rtems/score/threadimpl.h> #include <ctype.h> diff --git a/cpukit/score/src/objectgetnext.c b/cpukit/score/src/objectgetnext.c index 2a0ef43488..1ea6a58950 100644 --- a/cpukit/score/src/objectgetnext.c +++ b/cpukit/score/src/objectgetnext.c @@ -18,16 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <rtems/score/objectimpl.h> /* * _Objects_Get_next diff --git a/cpukit/score/src/objectgetnoprotection.c b/cpukit/score/src/objectgetnoprotection.c index e2083b4d09..4d376cde97 100644 --- a/cpukit/score/src/objectgetnoprotection.c +++ b/cpukit/score/src/objectgetnoprotection.c @@ -18,16 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <rtems/score/objectimpl.h> Objects_Control *_Objects_Get_no_protection( Objects_Information *information, diff --git a/cpukit/score/src/objectidtoname.c b/cpukit/score/src/objectidtoname.c index 54e4228b28..9aa0f10496 100644 --- a/cpukit/score/src/objectidtoname.c +++ b/cpukit/score/src/objectidtoname.c @@ -18,7 +18,6 @@ #include "config.h" #endif -#include <rtems/score/object.h> #include <rtems/score/threadimpl.h> Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( diff --git a/cpukit/score/src/objectinitializeinformation.c b/cpukit/score/src/objectinitializeinformation.c index 82c488a13f..a791bd7220 100644 --- a/cpukit/score/src/objectinitializeinformation.c +++ b/cpukit/score/src/objectinitializeinformation.c @@ -18,17 +18,11 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/chainimpl.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> +#include <rtems/score/interr.h> #include <rtems/score/sysstate.h> -#include <rtems/score/isr.h> +#include <rtems/score/wkspace.h> void _Objects_Initialize_information( Objects_Information *information, diff --git a/cpukit/score/src/objectmp.c b/cpukit/score/src/objectmp.c index 44319b9363..12daae6c91 100644 --- a/cpukit/score/src/objectmp.c +++ b/cpukit/score/src/objectmp.c @@ -18,12 +18,11 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/config.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/interr.h> -#include <rtems/score/object.h> +#include <rtems/score/threaddispatch.h> #include <rtems/score/wkspace.h> -#include <rtems/score/thread.h> +#include <rtems/config.h> void _Objects_MP_Handler_early_initialization(void) { diff --git a/cpukit/score/src/objectnamespaceremove.c b/cpukit/score/src/objectnamespaceremove.c index cd618457a4..3db39d7854 100644 --- a/cpukit/score/src/objectnamespaceremove.c +++ b/cpukit/score/src/objectnamespaceremove.c @@ -19,8 +19,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/wkspace.h> void _Objects_Namespace_remove( diff --git a/cpukit/score/src/objectnametoid.c b/cpukit/score/src/objectnametoid.c index bf3bb4c6d6..6d35e7cabe 100644 --- a/cpukit/score/src/objectnametoid.c +++ b/cpukit/score/src/objectnametoid.c @@ -18,16 +18,7 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <rtems/score/objectimpl.h> Objects_Name_or_id_lookup_errors _Objects_Name_to_id_u32( Objects_Information *information, diff --git a/cpukit/score/src/objectnametoidstring.c b/cpukit/score/src/objectnametoidstring.c index 4023635855..b27ee8a724 100644 --- a/cpukit/score/src/objectnametoidstring.c +++ b/cpukit/score/src/objectnametoidstring.c @@ -18,18 +18,9 @@ #include "config.h" #endif -#include <string.h> +#include <rtems/score/objectimpl.h> -#include <rtems/system.h> -#include <rtems/score/address.h> -#include <rtems/score/chain.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> +#include <string.h> #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string( diff --git a/cpukit/score/src/objectsetname.c b/cpukit/score/src/objectsetname.c index 2bc86cf553..995fa80bff 100644 --- a/cpukit/score/src/objectsetname.c +++ b/cpukit/score/src/objectsetname.c @@ -18,13 +18,9 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/object.h> -#include <rtems/score/thread.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/wkspace.h> -#include <stdlib.h> -#include <ctype.h> -#include <inttypes.h> + #include <string.h> bool _Objects_Set_name( diff --git a/cpukit/score/src/objectshrinkinformation.c b/cpukit/score/src/objectshrinkinformation.c index 686d0f2a5c..453c76c10f 100644 --- a/cpukit/score/src/objectshrinkinformation.c +++ b/cpukit/score/src/objectshrinkinformation.c @@ -18,16 +18,9 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/address.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/chainimpl.h> -#include <rtems/score/object.h> -#if defined(RTEMS_MULTIPROCESSING) -#include <rtems/score/objectmp.h> -#endif -#include <rtems/score/thread.h> #include <rtems/score/wkspace.h> -#include <rtems/score/isr.h> void _Objects_Shrink_information( Objects_Information *information diff --git a/cpukit/score/src/threaddispatchdisablelevel.c b/cpukit/score/src/threaddispatchdisablelevel.c index d15f4b1862..f1c971e33f 100644 --- a/cpukit/score/src/threaddispatchdisablelevel.c +++ b/cpukit/score/src/threaddispatchdisablelevel.c @@ -20,7 +20,6 @@ #include <rtems/score/context.h> #include <rtems/score/interr.h> #include <rtems/score/isr.h> -#include <rtems/score/object.h> #include <rtems/score/priority.h> #include <rtems/score/threaddispatch.h> diff --git a/cpukit/score/src/threadqextractwithproxy.c b/cpukit/score/src/threadqextractwithproxy.c index 6a3e891acf..221fd71706 100644 --- a/cpukit/score/src/threadqextractwithproxy.c +++ b/cpukit/score/src/threadqextractwithproxy.c @@ -24,6 +24,7 @@ #endif #include <rtems/score/threadqimpl.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/statesimpl.h> bool _Thread_queue_Extract_with_proxy( diff --git a/cpukit/score/src/threadqflush.c b/cpukit/score/src/threadqflush.c index a8288afc6c..1e1501e7b8 100644 --- a/cpukit/score/src/threadqflush.c +++ b/cpukit/score/src/threadqflush.c @@ -19,7 +19,7 @@ #endif #include <rtems/score/threadqimpl.h> -#include <rtems/score/object.h> +#include <rtems/score/objectimpl.h> void _Thread_queue_Flush( Thread_queue_Control *the_thread_queue, |