Program Listing for File RegionDescriptor.hpp¶
↰ Return to documentation for file (umap/RegionDescriptor.hpp)
//////////////////////////////////////////////////////////////////////////////
// Copyright 2017-2020 Lawrence Livermore National Security, LLC and other
// UMAP Project Developers. See the top-level LICENSE file for details.
//
// SPDX-License-Identifier: LGPL-2.1-only
//////////////////////////////////////////////////////////////////////////////
#ifndef _UMAP_RegionDescriptor_HPP
#define _UMAP_RegionDescriptor_HPP
#include <cassert>
#include <cstdint>
#include <pthread.h>
#include <string.h>
#include <unordered_set>
#include "umap/PageDescriptor.hpp"
#include "umap/store/Store.hpp"
#include "umap/util/Macros.hpp"
namespace Umap {
class RegionDescriptor {
public:
RegionDescriptor( char* umap_region, uint64_t umap_size
, char* mmap_region, uint64_t mmap_size
, Store* store )
: m_umap_region(umap_region), m_umap_region_size(umap_size)
, m_mmap_region(mmap_region), m_mmap_region_size(mmap_size)
, m_store(store) {}
~RegionDescriptor( void ) {delete m_store;}
inline uint64_t store_offset( char* addr ) {
assert("Invalid address for calculating offset" && addr >= start() && addr < end());
return (uint64_t)(addr - start());
}
inline uint64_t size( void ) { return m_umap_region_size; }
inline Store* store( void ) { return m_store; }
inline char* start( void ) { return m_umap_region; }
inline char* end( void ) { return start() + size(); }
inline uint64_t count( void ) { return m_active_pages.size(); }
inline void insert_page_descriptor(PageDescriptor* pd) {
m_active_pages.insert(pd);
}
inline void erase_page_descriptor(PageDescriptor* pd) {
UMAP_LOG(Debug, "Erasing PD: " << pd);
m_active_pages.erase(pd);
}
inline PageDescriptor* get_next_page_descriptor( void ) {
if ( m_active_pages.size() == 0 )
return nullptr;
auto it = m_active_pages.begin();
auto rval = *it;
rval->deferred = false;
erase_page_descriptor(rval);
return rval;
}
private:
char* m_umap_region;
uint64_t m_umap_region_size;
char* m_mmap_region;
uint64_t m_mmap_region_size;
Store* m_store;
std::unordered_set<PageDescriptor*> m_active_pages;
};
} // end of namespace Umap
#endif // _UMAP_RegionDescripto_HPP