From 8fb2bea426dc89b3550684f1f20bbef676cf87fb Mon Sep 17 00:00:00 2001 From: Zhongwei Yao Date: Wed, 24 Jul 2013 10:37:39 +0200 Subject: score: Add freechain --- cpukit/score/Makefile.am | 4 + cpukit/score/include/rtems/score/freechain.h | 108 +++++++++++++++++++++++++++ cpukit/score/preinstall.am | 4 + cpukit/score/src/freechain.c | 47 ++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 cpukit/score/include/rtems/score/freechain.h create mode 100644 cpukit/score/src/freechain.c (limited to 'cpukit/score') diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 817ad886e3..06b6f11c23 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -36,6 +36,7 @@ include_rtems_score_HEADERS += include/rtems/score/protectedheap.h include_rtems_score_HEADERS += include/rtems/score/interr.h 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/percpu.h include_rtems_score_HEADERS += include/rtems/score/priority.h @@ -257,6 +258,9 @@ libscore_a_SOURCES += src/pheapallocate.c \ src/pheapgetblocksize.c src/pheapgetfreeinfo.c src/pheapgetinfo.c \ src/pheapinit.c src/pheapresizeblock.c src/pheapwalk.c src/pheapiterate.c +## FREECHAIN_C_FILES +libscore_a_SOURCES += src/freechain.c + ## RBTREE_C_FILES libscore_a_SOURCES += src/rbtree.c \ src/rbtreeextract.c src/rbtreefind.c src/rbtreefindheader.c \ diff --git a/cpukit/score/include/rtems/score/freechain.h b/cpukit/score/include/rtems/score/freechain.h new file mode 100644 index 0000000000..d59de06319 --- /dev/null +++ b/cpukit/score/include/rtems/score/freechain.h @@ -0,0 +1,108 @@ +/** + * @file + * + * @ingroup ScoreFreechain + * + * @brief Freechain Handler API + */ +/* + * Copyright (c) 2013 Gedare Bloom. + * + * 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_FREECHAIN_H +#define _RTEMS_SCORE_FREECHAIN_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ScoreFreechain Freechain Handler + * + * @ingroup Score + * + * The Freechain Handler is used to manage a chain of nodes, of which size can + * automatically increase when there is no free node left. This handler + * provides one data structure: Freechain_Control. + * + * @{ + */ + +typedef struct Freechain_Control Freechain_Control; + +/** + * @brief Extends the freechain. + * + * @param[in] freechain The freechain control. + * + * @retval true The freechain contains now at least one node. + * @retval false Otherwise. + */ +typedef bool ( *Freechain_Extend )( Freechain_Control *freechain ); + +/** + * @typedef Freechain_Control + * + * This is used to manage freechain's nodes. + */ +struct Freechain_Control { + Chain_Control Freechain; + Freechain_Extend extend; +}; + +/** + * @brief Initializes a freechain. + * + * This routine initializes the freechain control structure to manage a chain + * of nodes. In case the freechain is empty the extend handler is called to + * get more nodes. + * + * @param[in,out] freechain The freechain control to initialize. + * @param[in] extend The extend handler. It is called by _Freechain_Get() in + * case the freechain is empty. + */ +void _Freechain_Initialize( + Freechain_Control *freechain, + Freechain_Extend extend +); + +/** + * @brief Gets a node from the freechain. + * + * @param[in,out] freechain The freechain control. + * + * @retval NULL The freechain is empty and the extend operation failed. + * @retval otherwise Pointer to a node. The node ownership passes to the + * caller. + */ +void *_Freechain_Get( + Freechain_Control *freechain +); + +/** + * @brief Puts a node back onto the freechain. + * + * @param[in,out] freechain The freechain control. + * @param[in] node The node to put back. + */ +void _Freechain_Put( + Freechain_Control *freechain, + void *node +); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am index 740e58e014..3bfc582830 100644 --- a/cpukit/score/preinstall.am +++ b/cpukit/score/preinstall.am @@ -127,6 +127,10 @@ $(PROJECT_INCLUDE)/rtems/score/isrlevel.h: include/rtems/score/isrlevel.h $(PROJ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/isrlevel.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/isrlevel.h +$(PROJECT_INCLUDE)/rtems/score/freechain.h: include/rtems/score/freechain.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/freechain.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/freechain.h + $(PROJECT_INCLUDE)/rtems/score/object.h: include/rtems/score/object.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.h diff --git a/cpukit/score/src/freechain.c b/cpukit/score/src/freechain.c new file mode 100644 index 0000000000..101a11e001 --- /dev/null +++ b/cpukit/score/src/freechain.c @@ -0,0 +1,47 @@ +/** + * @file + * + * @ingroup ScoreFreechain + * + * @brief Freechain Handler Implementation + */ + +/* + * Copyright (c) 2013 Gedare Bloom. + * + * 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 +#include + +void _Freechain_Initialize( + Freechain_Control *freechain, + Freechain_Extend extend +) +{ + _Chain_Initialize_empty( &freechain->Freechain ); + freechain->extend = extend; +} + +void *_Freechain_Get(Freechain_Control *freechain) +{ + if ( _Chain_Is_empty( &freechain->Freechain ) ) { + if ( !( *freechain->extend )( freechain ) ) { + return NULL; + } + } + + return _Chain_Get_first_unprotected( &freechain->Freechain ); +} + +void _Freechain_Put( Freechain_Control *freechain, void *node ) +{ + _Chain_Prepend_unprotected( &freechain->Freechain, node ); +} -- cgit v1.2.3