Listing 4: NoSwapDLMalloc
class NoSwapDLMalloc : PageTracker
{
public:
    NoSwapDLMalloc()
    {
        pageSize_ = malloc_getpagesize;
    }

    void* doAlloc(size_t numBytes, const void* hint)
    {
        void *pmem = dlmalloc(numBytes);
        if (!pmem)
        {
            throw std::bad_alloc();
        }

        if (!mlock(pmem, numBytes))
        {
            std::string msg(getErrorMsg());
            dlfree(pmem);
            throw std::bad_alloc();
        }

        addBlock(pmem, numBytes, pageSize_);
        return pmem;
    }

    void doFree(void* pmem, size_t numBytes)
    {
        removeBlock(pmem, numBytes, pageSize_, munlock);
        dlfree(pmem);
    }

private:
    std::string getErrorMsg();
    size_t pageSize_;
};