MemoryArea.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryArea.h -------------------------------------------------------===// 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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_MEMORY_AREA_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_MEMORY_AREA_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/ADT/Uncopyable.h" 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/FileSystem.h" 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/Path.h" 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist_node.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <fcntl.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <list> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#if defined(ENABLE_UNITTEST) 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcldtest 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao class MemoryAreaTest; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcldtest 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MemoryRegion; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass RegionFactory; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MemoryArea 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief MemoryArea is used to manage distinct MemoryRegions of address space. 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Good linkers must well manipulate memory mapped I/O and dynamic memory. 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * In MCLinker, MemoryArea is the decision-maker to use memory mapped I/O or 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * dynamic memory. When a client requests MemoryArea for a piece of memory 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * to hold a part of a file, MemoryArea is going to see whether the requested 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * part of the file is already in any existing memory which is requested 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * before. If it is, MemoryArea creates a new MemoryRegion within the memory 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * requested before. Otherwise, MemoryArea uses memory mapped I/O or dynamic 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * memory to load the file. 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * If the part a file being loaded is larger than 3/4 pages, MemoryArea uses 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * memory mapped I/O to load the file. Otherwise, MemoryArea uses dynamic 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * memory to read the content of file into the memory space. 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MemoryArea : private Uncopyable 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#if defined(ENABLE_UNITTEST) 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaofriend class mcldtest::MemoryAreaTest; 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum IOState 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GoodBit = 0, 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao BadBit = 1L << 0, 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EOFBit = 1L << 1, 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao FailBit = 1L << 2, 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao IOStateEnd = 1L << 16 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum AccessMode 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReadOnly = O_RDONLY, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao WriteOnly = O_WRONLY, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ReadWrite = O_RDWR, 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao AccessMask = O_ACCMODE 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef sys::fs::detail::Address Address; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao friend class MemoryRegion; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao friend class RegionFactory; 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao struct Space : public llvm::ilist_node<Space> 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Type 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ALLOCATED_ARRAY, 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MMAPED, 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao UNALLOCATED 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Space() 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_pParent(NULL), 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao type(UNALLOCATED), 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao file_offset(0), 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size(0), 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao data(0), 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region_num(0) 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { } 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Space(MemoryArea* pParent, size_t pOffset, size_t pLength) 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_pParent(pParent), 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao type(UNALLOCATED), 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao file_offset(pOffset), 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size(pLength), 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao data(0), 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region_num(0) 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { } 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~Space() 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { } 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void sync() 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_pParent->write(*this); } 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao private: 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryArea* m_pParent; 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Type type; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t file_offset; 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t size; 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao sys::fs::detail::Address data; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t region_num; 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao friend class Space; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::iplist<Space> SpaceList; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // constructor 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // @param pRegionFactory the factory to manage MemoryRegions 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryArea(RegionFactory& pRegionFactory); 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // destructor 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~MemoryArea(); 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // request - create a MemoryRegion within a sufficient space 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // find an existing space to hold the MemoryRegion. 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // if MemoryArea does not find such space, then it creates a new space and 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // assign a MemoryRegion into the space. 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* request(size_t pOffset, size_t pLength); 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // release - release a MemoryRegion. 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // release a MemoryRegion does not cause 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void release(MemoryRegion* pRegion); 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // clean - release all MemoryRegion and unmap all spaces. 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void clean(); 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // sync - sync all MemoryRegion 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void sync(); 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // map - open the file pPath and mapped it onto MemoryArea 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // @param flags see man 2 open 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void map(const sys::fs::Path& pPath, int flags); 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // map - open the file pPath and mapped it onto MemoryArea 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // @param flags see man 2 open 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // @param mode see man 2 open 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void map(const sys::fs::Path& pPath, int flags, int mode); 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // unmap - close the opened file and unmap the MemoryArea 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void unmap(); 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // path - the path of the mapped file. 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const sys::fs::Path& path() const 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_FilePath; } 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // size - the real size of the mapped file. 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t size() const 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_FileSize; } 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isMapped - check if MemoryArea is mapped to a file 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isMapped() const; 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isGood - check if the state of the opened area is good for read/write 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // operations 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isGood() const; 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isBad - check if an error causes the loss of integrity of the memory space 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isBad() const; 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isFailed - check if an error related to the internal logic of the operation 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // itself occurs 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFailed() const; 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isEOF - check if we reach the end of the file 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isEOF() const; 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isReadable - check if the memory area is readable 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isReadable() const; 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // isWriteable - check if the memory area is writable 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isWritable() const; 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // rdstate - get error state flags 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Returns the current internal error state flags of the stream 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int rdstate() const; 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // setState - set error state flag 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setState(IOState pState); 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // clear - set error state flag 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void clear(IOState pState = GoodBit); 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // readToBuffer - read data from the file behind this MemorySpace and store 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // those bytes in pBuf. Return the number of byte read or -1 on error. 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ssize_t readToBuffer(sys::fs::detail::Address pBuf, 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t pSize, size_t pOffset); 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // find - first fit search 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Space* find(size_t pOffset, size_t pLength); 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // release a Space, but does not remove it from space list 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void release(Space* pSpace); 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // read - read data from mapped file into virtual memroy of pSpace. Return 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // false on error. 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool read(Space& pSpace); 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // write - write back the virtual memory of pSpace into mapped file. 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void write(const Space& pSpace); 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // truncate - truncate the file size to length. 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void truncate(size_t pLength); 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // policy - decide whehter to use dynamic memory or memory mapped I/O 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Space::Type policy(off_t pOffset, size_t pLength); 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // the size of one page 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const off_t PageSize = 4096; 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // page_boundary - Given a file size, return the size to read integral pages. 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // return the first page boundary after pFileOffset 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static off_t page_boundary(off_t pFileOffset) 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (pFileOffset + (PageSize - 1)) & ~ (PageSize - 1); } 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Given a file offset, return the page offset. 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // return the first page boundary before pFileOffset 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static off_t page_offset(off_t pFileOffset) 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return pFileOffset & ~ (PageSize - 1); } 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao RegionFactory& m_RegionFactory; 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao sys::fs::Path m_FilePath; 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int m_FileDescriptor; 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_FileSize; 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int m_AccessFlags; 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int m_State; 2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SpaceList m_SpaceList; 2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 261