forked from Imagelibrary/rtems
@@ -210,7 +210,7 @@ libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
|
||||
|
||||
## OBJECT_C_FILES
|
||||
libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
|
||||
src/objectextendinformation.c src/objectfree.c src/objectget.c \
|
||||
src/objectextendinformation.c src/objectfree.c \
|
||||
src/objectgetisr.c src/objectgetnext.c src/objectinitializeinformation.c \
|
||||
src/objectnametoid.c src/objectnametoidstring.c \
|
||||
src/objectshrinkinformation.c src/objectgetnoprotection.c \
|
||||
|
||||
@@ -289,7 +289,7 @@ typedef struct {
|
||||
|
||||
/**
|
||||
* The following defines the constant which may be used
|
||||
* with _Objects_Get to manipulate the calling task.
|
||||
* to manipulate the calling task.
|
||||
*/
|
||||
#define OBJECTS_ID_OF_SELF ((Objects_Id) 0)
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ typedef enum {
|
||||
|
||||
/**
|
||||
* This enumerated type lists the locations which may be returned
|
||||
* by _Objects_Get. These codes indicate the success of locating
|
||||
* by _Objects_Get_isr_disable. These codes indicate the success of locating
|
||||
* an object with the specified ID.
|
||||
*/
|
||||
typedef enum {
|
||||
@@ -405,45 +405,33 @@ Objects_Control *_Objects_Allocate( Objects_Information *information );
|
||||
* @code
|
||||
* rtems_status_code some_delete( rtems_id id )
|
||||
* {
|
||||
* rtems_status_code sc;
|
||||
* Some_Control *some;
|
||||
* Objects_Locations location;
|
||||
*
|
||||
* // The object allocator mutex protects the executing thread from
|
||||
* // asynchronous thread restart and deletion.
|
||||
* _Objects_Allocator_lock();
|
||||
*
|
||||
* // This will disable thread dispatching, so this starts a thread dispatch
|
||||
* // critical section.
|
||||
* // Get the object under protection of the object allocator mutex.
|
||||
* some = (Semaphore_Control *)
|
||||
* _Objects_Get( &_Some_Information, id, &location );
|
||||
* _Objects_Get_no_protection( id, &_Some_Information );
|
||||
*
|
||||
* switch ( location ) {
|
||||
* case OBJECTS_LOCAL:
|
||||
* // After the object close an object get with this identifier will
|
||||
* // fail.
|
||||
* _Objects_Close( &_Some_Information, &some->Object );
|
||||
*
|
||||
* _Some_Delete( some );
|
||||
*
|
||||
* // This enables thread dispatching, so the thread dispatch critical
|
||||
* // section ends here.
|
||||
* _Objects_Put( &some->Object );
|
||||
*
|
||||
* // Thread dispatching is enabled. The object free is only protected
|
||||
* // by the object allocator mutex.
|
||||
* _Objects_Free( &_Some_Information, &some->Object );
|
||||
*
|
||||
* sc = RTEMS_SUCCESSFUL;
|
||||
* break;
|
||||
* default:
|
||||
* sc = RTEMS_INVALID_ID;
|
||||
* break;
|
||||
* if ( some == NULL ) {
|
||||
* _Objects_Allocator_unlock();
|
||||
* return RTEMS_INVALID_ID;
|
||||
* }
|
||||
*
|
||||
* _Objects_Allocator_unlock();
|
||||
* // After the object close an object get with this identifier will
|
||||
* // fail.
|
||||
* _Objects_Close( &_Some_Information, &some->Object );
|
||||
*
|
||||
* return sc;
|
||||
* _Some_Delete( some );
|
||||
*
|
||||
* // Thread dispatching is enabled. The object free is only protected
|
||||
* // by the object allocator mutex.
|
||||
* _Objects_Free( &_Some_Information, &some->Object );
|
||||
*
|
||||
* _Objects_Allocator_unlock();
|
||||
* return RTEMS_SUCCESSFUL;
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
@@ -554,38 +542,6 @@ Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
|
||||
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.
|
||||
*
|
||||
@@ -607,11 +563,6 @@ Objects_Control *_Objects_Get (
|
||||
* @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,
|
||||
@@ -667,11 +618,6 @@ Objects_Control *_Objects_Get_local(
|
||||
* @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_Id id,
|
||||
@@ -679,8 +625,7 @@ Objects_Control *_Objects_Get_no_protection(
|
||||
);
|
||||
|
||||
/**
|
||||
* Like @ref _Objects_Get, but is used to find "next" open
|
||||
* object.
|
||||
* Gets the next open object after the specified object identifier.
|
||||
*
|
||||
* Locks the object allocator mutex in case a next object exists.
|
||||
*
|
||||
@@ -1059,35 +1004,6 @@ RTEMS_INLINE_ROUTINE void _Objects_Open_string(
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 Locks the object allocator mutex.
|
||||
*
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* @file
|
||||
*
|
||||
* @brief Get Object
|
||||
* @ingroup Score
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-1999.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/score/objectimpl.h>
|
||||
|
||||
Objects_Control *_Objects_Get(
|
||||
Objects_Information *information,
|
||||
Objects_Id id,
|
||||
Objects_Locations *location
|
||||
)
|
||||
{
|
||||
Objects_Control *the_object;
|
||||
uint32_t index;
|
||||
|
||||
/*
|
||||
* Extract the index portion of an Id in a way that produces a valid
|
||||
* index for objects within this class and an invalid value for objects
|
||||
* outside this class.
|
||||
*
|
||||
* If the Id matches the api, class, and node but index portion is 0,
|
||||
* then the subtraction will underflow and the addition of 1 will
|
||||
* result in a 0 index. The zeroth element in the local_table is
|
||||
* always NULL.
|
||||
*
|
||||
* If the Id is valid but the object has not been created yet, then
|
||||
* the local_table entry will be NULL.
|
||||
*/
|
||||
index = id - information->minimum_id + 1;
|
||||
|
||||
/*
|
||||
* If the index is less than maximum, then it is OK to use it to
|
||||
* index into the local_table array.
|
||||
*/
|
||||
if ( index <= information->maximum ) {
|
||||
_Thread_Disable_dispatch();
|
||||
if ( (the_object = information->local_table[ index ]) != NULL ) {
|
||||
*location = OBJECTS_LOCAL;
|
||||
return the_object;
|
||||
}
|
||||
|
||||
/*
|
||||
* Valid Id for this API, Class and Node but the object has not
|
||||
* been allocated yet.
|
||||
*/
|
||||
_Thread_Enable_dispatch();
|
||||
*location = OBJECTS_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Object Id is not within this API and Class on this node. So
|
||||
* it may be global in a multiprocessing system. But it is clearly
|
||||
* invalid on a single processor system.
|
||||
*/
|
||||
|
||||
#if defined(RTEMS_MULTIPROCESSING)
|
||||
*location = _Objects_MP_Is_remote( information, id );
|
||||
#else
|
||||
*location = OBJECTS_ERROR;
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user