Listing 1: SecureAllocator
template
<
class T,
class ScrubPolicy = ScrubOnDestroy<BasicScrubber>,
class AllocPolicy = NoSwapHeap,
class LockPolicy = NoLocking<AllocPolicy>
>
class SecureAllocator
{
public:
// Common allocator typedefs
...
size_type max_size()
{
return getAllocator().max_count(sizeof(T));
}
pointer allocate(size_type num, const_pointer hint = 0)
{
LockPolicy::Lock lock;
void* pmem = getAllocator().doAlloc(num * sizeof(T), hint);
if (!pmem)
{
throw std::bad_alloc();
}
return static_cast<pointer>(pmem);
}
void deallocate(pointer pmem, size_type num)
{
LockPolicy::Lock lock;
getScrubber().onDeallocate(pmem, num * sizeof(T));
getAllocator().doFree(pmem, num * sizeof(T));
}
void construct(pointer pmem, const value_type& val)
{
new(pmem) value_type(val);
}
void destroy(pointer pmem)
{
pmem->~value_type();
getScrubber().onDestroy(pmem, sizeof(T));
}
private:
AllocPolicy& getAllocator()
{
return PolicyHolder<AllocPolicy>::getPolicy();
}
ScrubPolicy& getScrubber()
{
return PolicyHolder<ScrubPolicy>::getPolicy();
}
};
template <class Policy>
class PolicyHolder
{
public:
typedef MutexLocking<Policy*>::VolatileType PtrType;
static Policy& getPolicy()
{
static PtrType pPol = NULL;
if (pPol == NULL)
{
typename MutexLocking<PolicyHolder<Policy> >::Lock lock;
if (pPol == NULL)
{
pPol = new Policy();
}
}
return *pPol;
}
};