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