//===- MemoryAreaFactory.cpp ----------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/Support/MemoryAreaFactory.h>
#include <mcld/Support/MsgHandling.h>
#include <mcld/Support/SystemUtils.h>
#include <mcld/Support/Space.h>
using namespace mcld;
//===----------------------------------------------------------------------===//
// MemoryAreaFactory
//===----------------------------------------------------------------------===//
MemoryAreaFactory::MemoryAreaFactory(size_t pNum)
: GCFactory<MemoryArea, 0>(pNum) {
}
MemoryAreaFactory::~MemoryAreaFactory()
{
HandleToArea::iterator rec, rEnd = m_HandleToArea.end();
for (rec = m_HandleToArea.begin(); rec != rEnd; ++rec) {
if (rec->handle->isOpened()) {
rec->handle->close();
}
delete rec->handle;
}
}
MemoryArea*
MemoryAreaFactory::produce(const sys::fs::Path& pPath,
FileHandle::OpenMode pMode)
{
HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath);
if (NULL == map_result.area) {
// can not found
FileHandle* handler = new FileHandle();
if (!handler->open(pPath, pMode)) {
error(diag::err_cannot_open_file) << pPath
<< sys::strerror(handler->error());
}
MemoryArea* result = allocate();
new (result) MemoryArea(*handler);
m_HandleToArea.push_back(handler, result);
return result;
}
return map_result.area;
}
MemoryArea*
MemoryAreaFactory::produce(const sys::fs::Path& pPath,
FileHandle::OpenMode pMode,
FileHandle::Permission pPerm)
{
HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath);
if (NULL == map_result.area) {
// can not found
FileHandle* handler = new FileHandle();
if (!handler->open(pPath, pMode, pPerm)) {
error(diag::err_cannot_open_file) << pPath
<< sys::strerror(handler->error());
}
MemoryArea* result = allocate();
new (result) MemoryArea(*handler);
m_HandleToArea.push_back(handler, result);
return result;
}
return map_result.area;
}
MemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize)
{
Space* space = Space::Create(pMemBuffer, pSize);
MemoryArea* result = allocate();
new (result) MemoryArea(*space);
return result;
}
MemoryArea*
MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode)
{
FileHandle* handler = new FileHandle();
handler->delegate(pFD, pMode);
MemoryArea* result = allocate();
new (result) MemoryArea(*handler);
return result;
}
void MemoryAreaFactory::destruct(MemoryArea* pArea)
{
m_HandleToArea.erase(pArea);
pArea->clear();
pArea->handler()->close();
destroy(pArea);
deallocate(pArea);
}