15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryAreaFactory.cpp ----------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryAreaFactory.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/SystemUtils.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Space.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MemoryAreaFactory 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryAreaFactory::MemoryAreaFactory(size_t pNum) 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : GCFactory<MemoryArea, 0>(pNum) { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryAreaFactory::~MemoryAreaFactory() 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToArea::iterator rec, rEnd = m_HandleToArea.end(); 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (rec = m_HandleToArea.begin(); rec != rEnd; ++rec) { 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (rec->handle->isOpened()) { 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang rec->handle->close(); 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang delete rec->handle; 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 34affc150dc44fab1911775a49636d0ce85333b634Zonr ChangMemoryArea* 35affc150dc44fab1911775a49636d0ce85333b634Zonr ChangMemoryAreaFactory::produce(const sys::fs::Path& pPath, 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode) 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath); 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == map_result.area) { 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // can not found 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle* handler = new FileHandle(); 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!handler->open(pPath, pMode)) { 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_cannot_open_file) << pPath 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang << sys::strerror(handler->error()); 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) MemoryArea(*handler); 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_HandleToArea.push_back(handler, result); 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return map_result.area; 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 57affc150dc44fab1911775a49636d0ce85333b634Zonr ChangMemoryArea* 58affc150dc44fab1911775a49636d0ce85333b634Zonr ChangMemoryAreaFactory::produce(const sys::fs::Path& pPath, 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::OpenMode pMode, 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle::Permission pPerm) 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath); 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == map_result.area) { 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // can not found 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle* handler = new FileHandle(); 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!handler->open(pPath, pMode, pPerm)) { 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang error(diag::err_cannot_open_file) << pPath 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang << sys::strerror(handler->error()); 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) MemoryArea(*handler); 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_HandleToArea.push_back(handler, result); 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return map_result.area; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize) 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Space* space = Space::Create(pMemBuffer, pSize); 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) MemoryArea(*space); 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return result; 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 89affc150dc44fab1911775a49636d0ce85333b634Zonr ChangMemoryArea* 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoMemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FileHandle* handler = new FileHandle(); 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang handler->delegate(pFD, pMode); 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* result = allocate(); 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) MemoryArea(*handler); 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result; 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid MemoryAreaFactory::destruct(MemoryArea* pArea) 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_HandleToArea.erase(pArea); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pArea->clear(); 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pArea->handler()->close(); 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao destroy(pArea); 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao deallocate(pArea); 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 110