MemoryAreaFactory.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
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/RegionFactory.h"
11
12using namespace mcld;
13
14//==========================
15// MemoryAreaFactory
16MemoryAreaFactory::MemoryAreaFactory(size_t pNum)
17  : UniqueGCFactoryBase<sys::fs::Path, MemoryArea, 0>(pNum) {
18  // For each loaded file, MCLinker must load ELF header, section header,
19  // symbol table, and string table. So, we set the size of chunk quadruple
20  // larger than the number of input files.
21  m_pRegionFactory = new RegionFactory(pNum*4);
22}
23
24MemoryAreaFactory::~MemoryAreaFactory()
25{
26  delete m_pRegionFactory;
27}
28
29MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, int pFlags)
30{
31  MemoryArea* result = find(pPath);
32  if (0 == result) {
33    result = allocate();
34    new (result) MemoryArea(*m_pRegionFactory);
35    result->map(pPath, pFlags);
36    f_KeyMap.insert(std::make_pair(pPath, result));
37  }
38  return result;
39}
40
41MemoryArea* MemoryAreaFactory::produce(const sys::fs::Path& pPath, int pFlags, mode_t pMode)
42{
43  MemoryArea* result = find(pPath);
44  if (0 == result) {
45    result = allocate();
46    new (result) MemoryArea(*m_pRegionFactory);
47    result->map(pPath, pFlags, pMode);
48    f_KeyMap.insert(std::make_pair(pPath, result));
49  }
50  return result;
51}
52
53