1 //===- MemoryAreaFactory.cpp ----------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include <mcld/Support/MemoryAreaFactory.h> 10 #include <mcld/Support/MsgHandling.h> 11 #include <mcld/Support/SystemUtils.h> 12 #include <mcld/Support/Space.h> 13 14 using namespace mcld; 15 16 //===----------------------------------------------------------------------===// 17 // MemoryAreaFactory 18 //===----------------------------------------------------------------------===// 19 MemoryAreaFactory::MemoryAreaFactory(size_t pNum) 20 : GCFactory<MemoryArea, 0>(pNum) { 21 } 22 23 MemoryAreaFactory::~MemoryAreaFactory() 24 { 25 HandleToArea::iterator rec, rEnd = m_HandleToArea.end(); 26 for (rec = m_HandleToArea.begin(); rec != rEnd; ++rec) { 27 if (rec->handle->isOpened()) { 28 rec->handle->close(); 29 } 30 delete rec->handle; 31 } 32 } 33 34 MemoryArea* 35 MemoryAreaFactory::produce(const sys::fs::Path& pPath, 36 FileHandle::OpenMode pMode) 37 { 38 HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath); 39 if (NULL == map_result.area) { 40 // can not found 41 FileHandle* handler = new FileHandle(); 42 if (!handler->open(pPath, pMode)) { 43 error(diag::err_cannot_open_file) << pPath 44 << sys::strerror(handler->error()); 45 } 46 47 MemoryArea* result = allocate(); 48 new (result) MemoryArea(*handler); 49 50 m_HandleToArea.push_back(handler, result); 51 return result; 52 } 53 54 return map_result.area; 55 } 56 57 MemoryArea* 58 MemoryAreaFactory::produce(const sys::fs::Path& pPath, 59 FileHandle::OpenMode pMode, 60 FileHandle::Permission pPerm) 61 { 62 HandleToArea::Result map_result = m_HandleToArea.findFirst(pPath); 63 if (NULL == map_result.area) { 64 // can not found 65 FileHandle* handler = new FileHandle(); 66 if (!handler->open(pPath, pMode, pPerm)) { 67 error(diag::err_cannot_open_file) << pPath 68 << sys::strerror(handler->error()); 69 } 70 71 MemoryArea* result = allocate(); 72 new (result) MemoryArea(*handler); 73 74 m_HandleToArea.push_back(handler, result); 75 return result; 76 } 77 78 return map_result.area; 79 } 80 81 MemoryArea* MemoryAreaFactory::produce(void* pMemBuffer, size_t pSize) 82 { 83 Space* space = Space::Create(pMemBuffer, pSize); 84 MemoryArea* result = allocate(); 85 new (result) MemoryArea(*space); 86 return result; 87 } 88 89 MemoryArea* 90 MemoryAreaFactory::produce(int pFD, FileHandle::OpenMode pMode) 91 { 92 FileHandle* handler = new FileHandle(); 93 handler->delegate(pFD, pMode); 94 95 MemoryArea* result = allocate(); 96 new (result) MemoryArea(*handler); 97 98 return result; 99 } 100 101 void MemoryAreaFactory::destruct(MemoryArea* pArea) 102 { 103 m_HandleToArea.erase(pArea); 104 pArea->clear(); 105 pArea->handler()->close(); 106 destroy(pArea); 107 deallocate(pArea); 108 } 109 110