FileOutputBuffer.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
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 28llvm::error_code FileOutputBuffer::create(FileHandle& pFileHandle, 29 size_t pSize, llvm::OwningPtr<FileOutputBuffer>& pResult) 30{ 31 llvm::error_code EC; 32 llvm::OwningPtr<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.take(); 46 return llvm::error_code::success(); 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