FileOutputBuffer.cpp revision a790f0a8f3175183bea088389b3e4ae41813e192
1//===- FileOutputBuffer.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/FileOutputBuffer.h>
10#include <mcld/Support/FileHandle.h>
11#include <mcld/Support/Path.h>
12
13using namespace mcld;
14using llvm::sys::fs::mapped_file_region;
15
16FileOutputBuffer::FileOutputBuffer(llvm::sys::fs::mapped_file_region* pRegion,
17                                   FileHandle& pFileHandle)
18  : m_pRegion(pRegion), m_FileHandle(pFileHandle)
19{
20}
21
22FileOutputBuffer::~FileOutputBuffer()
23{
24  // Unmap buffer, letting OS flush dirty pages to file on disk.
25  m_pRegion.reset(0);
26}
27
28std::error_code FileOutputBuffer::create(FileHandle& pFileHandle,
29    size_t pSize, std::unique_ptr<FileOutputBuffer>& pResult)
30{
31  std::error_code ec;
32  std::unique_ptr<mapped_file_region> mapped_file(new mapped_file_region(
33      pFileHandle.handler(),
34      false,
35      mapped_file_region::readwrite,
36      pSize,
37      0,
38      ec));
39
40  if (ec)
41    return ec;
42
43  pResult.reset(new FileOutputBuffer(mapped_file.get(), pFileHandle));
44  if (pResult)
45    mapped_file.release();
46  return std::error_code();
47}
48
49MemoryRegion FileOutputBuffer::request(size_t pOffset, size_t pLength)
50{
51  if (pOffset > getBufferSize() || (pOffset + pLength) > getBufferSize())
52    return MemoryRegion();
53  return MemoryRegion(getBufferStart() + pOffset, pLength);
54}
55
56llvm::StringRef FileOutputBuffer::getPath() const
57{
58  return m_FileHandle.path().native();
59}
60