blob: 96686b710d66ab86b8b71ee78352a37460d45388 [file] [log] [blame]
/* ----------------------------------------------------------------------- *//**
*
* @file AbstractAllocator.hpp
*
*//* ----------------------------------------------------------------------- */
/**
* @brief Abstract base class a memory allocator
*
* This class provides the interface that MADlib modules use for memory
* management.
*/
class AbstractAllocator {
public:
/**
* @brief Context for memory allocations.
*
* Two contexts are available in the abstraction layer: Current
* (user-defined) function call, and aggregate context. The main difference
* will be when automatic garbage collection takes place (if the DBMS
* supports it).
*/
enum Context { kFunction, kAggregate };
enum ZeroMemory { kDoNotZero, kZero };
virtual ~AbstractAllocator() { }
/**
* @brief Allocate memory for raw data and the DBMS-specific meta data.
*
* Subclasses need to override this function to allocate an array in the
* DBMS-specific way. The purpose of this function is to enable efficient
* implementations of user-defined functions that return arrays:
* In this case, the UDF could create the array during its execution, fill
* it with data, and eventually return the result array by reference.
*
* Note: The second argument is purely a type parameter.
*/
virtual MemHandleSPtr allocateArray(uint64_t inNumElements,
double * = NULL /* ignored */) const = 0;
/**
* @brief Allocate a block of memory. Throw if allocation fails.
*/
virtual void *allocate(const size_t inSize) const throw(std::bad_alloc) = 0;
/**
* @brief Allocate a block of memory. Return NULL if allocation fails.
*/
virtual void *allocate(const size_t inSize, const std::nothrow_t&) const
throw() = 0;
/**
* @brief Free a block of memory previously allocated with allocate()
*/
virtual void free(void *inPtr) const throw() = 0;
};
/**
* @brief Return the default allocator
*
* This needs to be defined in the DBMS-specific part.
*/
AbstractAllocator &defaultAllocator();