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