/** * @file * * @ingroup ClassicRegionImpl * * @brief Classic Region Manager Implementation */ /* COPYRIGHT (c) 1989-2008. * 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. */ #ifndef _RTEMS_RTEMS_REGIONIMPL_H #define _RTEMS_RTEMS_REGIONIMPL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @defgroup ClassicRegionImpl Classic Region Manager Implementation * * @ingroup ClassicRegion * * @{ */ /** * @brief Instantiate RTEMS Region Data * * Region Manager -- Instantiate Data * * This constant is defined to extern most of the time when using * this header file. However by defining it to nothing, the data * declared in this header file can be instantiated. This is done * in a single per manager file. */ #ifndef RTEMS_REGION_EXTERN #define RTEMS_REGION_EXTERN extern #endif /** * The following defines the information control block used to * manage this class of objects. */ RTEMS_REGION_EXTERN Objects_Information _Region_Information; /** * @brief _Region_Manager_initialization * * Region Manager * * This routine performs the initialization necessary for this manager. */ void _Region_Manager_initialization(void); /** * @brief Region_Allocate * * This function allocates a region control block from * the inactive chain of free region control blocks. */ RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void ) { return (Region_Control *) _Objects_Allocate( &_Region_Information ); } /** * @brief Region_Free * * This routine frees a region control block to the * inactive chain of free region control blocks. */ RTEMS_INLINE_ROUTINE void _Region_Free ( Region_Control *the_region ) { _Objects_Free( &_Region_Information, &the_region->Object ); } /** * @brief Region_Get * * This function maps region IDs to region control blocks. * If ID corresponds to a local region, then it returns * the_region control pointer which maps to ID and location * is set to OBJECTS_LOCAL. Otherwise, location is set * to OBJECTS_ERROR and the_region is undefined. */ RTEMS_INLINE_ROUTINE Region_Control *_Region_Get ( Objects_Id id, Objects_Locations *location ) { return (Region_Control *) _Objects_Get_no_protection( &_Region_Information, id, location ); } /** * @brief Region_Allocate_segment * * This function attempts to allocate a segment from the_region. * If successful, it returns the address of the allocated segment. * Otherwise, it returns NULL. */ RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment ( Region_Control *the_region, uintptr_t size ) { return _Heap_Allocate( &the_region->Memory, size ); } /** * @brief Region_Free_segment * * This function frees the_segment to the_region. */ RTEMS_INLINE_ROUTINE bool _Region_Free_segment ( Region_Control *the_region, void *the_segment ) { return _Heap_Free( &the_region->Memory, the_segment ); } /** * @brief Region_Is_null * * This function returns TRUE if the_region is NULL and FALSE otherwise. */ RTEMS_INLINE_ROUTINE bool _Region_Is_null ( Region_Control *the_region ) { return ( the_region == NULL ); } /** * @brief Process Region Queue * * This is a helper routine which is invoked any time memory is * freed. It looks at the set of waiting tasks and attempts to * satisfy all outstanding requests. * * @param[in] the_region is the the region */ extern void _Region_Process_queue(Region_Control *the_region); /** * @brief _Region_Debug_Walk * * This routine is invoked to verify the integrity of a heap associated * with the_region. */ #ifdef RTEMS_DEBUG #define _Region_Debug_Walk( _the_region, _source ) \ do { \ if ( rtems_debug_is_enabled( RTEMS_DEBUG_REGION ) ) \ _Heap_Walk( &(_the_region)->Memory, _source, false ); \ } while ( 0 ) #else #define _Region_Debug_Walk( _the_region, _source ) #endif /**@}*/ #ifdef __cplusplus } #endif #if defined(RTEMS_MULTIPROCESSING) #include #endif #endif /* end of include file */