From 83e18669b6c2322c8eb5f8632ac823877d765e0d Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Wed, 18 May 2011 11:49:26 -0500 Subject: Device Framework support. Change-Id: I133f58df309c7fc3a7faa261699eba66a6bae4be Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/98 Tested-by: Jenkins Server Reviewed-by: Thi N. Tran Reviewed-by: Andrew J. Geissler --- src/usr/devicefw/assoccontain.H | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/usr/devicefw/assoccontain.H (limited to 'src/usr/devicefw/assoccontain.H') diff --git a/src/usr/devicefw/assoccontain.H b/src/usr/devicefw/assoccontain.H new file mode 100644 index 000000000..9786168e0 --- /dev/null +++ b/src/usr/devicefw/assoccontain.H @@ -0,0 +1,93 @@ +/** @file assoccontain.H + * @brief Provides a memory pool container for allocating blocks of + * associations for the device driver framework. + * + * This class exists because storing the information in a normal map or + * vector would be exceptionally big for the expected sparseness of the + * device driver associations. + */ + +#ifndef __DEVICEFW_ASSOCCONTAIN_H +#define __DEVICEFW_ASSOCCONTAIN_H + +#include +#include + +namespace DeviceFW +{ + /** @struct AssociationData + * @brief Data about a particular association. + * + * Typically this is a offset (pointer) to another association and an + * optional flag for the associatior to use. This allows a user to + * construct a light-weight multi-dimensional sparse array. + * + * The purpose of the flag field is left to the user. + */ + struct AssociationData + { + bool flag:1; + size_t offset:15; + + AssociationData() : flag(false), offset(0) { }; + + AssociationData(bool i_flag, size_t i_off) + : flag(i_flag), offset(i_off) { }; + + } PACKED; + + /** @class AssociationContainer + * @brief The memory pool container of AssociationData blocks. + * + * The typical usage of this will be to create a multi-dimensional sparse + * associative array (map). The first block allocated will be the first + * dimension of the array. Each AssociationData entry in the block is the + * offset of the block containing the AssociationData for the next + * dimension. At the lowest level this offset might be used as an offset + * into another container, such as an std::vector. + */ + class AssociationContainer + { + public: + /** + * @brief Constructor for AssociationContainer. + * + * Initializes internal members to clean values. + */ + AssociationContainer(); + + /** + * @brief Destructor for AssociationContainer. + * + * Releases memory associated with container. After this call + * all pointers previously obtained through operator[] are invalid. + */ + ~AssociationContainer(); + + /** + * @brief Look up a particular association entry by offset. + * @return A pointer to the requested association block. + * + * @note Will return a NULL pointer if an invalid offset is given. + */ + AssociationData* operator[](size_t) const; + + /** + * @brief Allocate a new block into the pool. + * @return A offset to the newly allocated block. + * + * The blocks allocated will all be erased to 0's. + * + * @note This function can change the pointers previously + * returned by the operator[]. Treat this function + * as though all previous pointers are invalidated. + */ + size_t allocate(size_t); + + private: + AssociationData* iv_data; + size_t iv_size; + }; +}; + +#endif -- cgit v1.2.1