libfoedus-core
FOEDUS Core Library
Main Page
Related Pages
Modules
Namespaces
Classes
Files
Jenkins (x86_64 Fedora)
Jenkins (x86_64 Ubuntu)
Jenkins (aarch64 Ubuntu)
Github
Wiki
File List
File Members
page_resolver.hpp
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2014-2015, Hewlett-Packard Development Company, LP.
3
* This program is free software; you can redistribute it and/or modify it
4
* under the terms of the GNU General Public License as published by the Free
5
* Software Foundation; either version 2 of the License, or (at your option)
6
* any later version.
7
*
8
* This program is distributed in the hope that it will be useful, but WITHOUT
9
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
* more details. You should have received a copy of the GNU General Public
12
* License along with this program; if not, write to the Free Software
13
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14
*
15
* HP designates this particular file as subject to the "Classpath" exception
16
* as provided by HP in the LICENSE.txt file that accompanied this code.
17
*/
18
#ifndef FOEDUS_MEMORY_PAGE_RESOLVER_HPP_
19
#define FOEDUS_MEMORY_PAGE_RESOLVER_HPP_
20
#include <cstring>
21
22
#include "
foedus/assert_nd.hpp
"
23
#include "
foedus/compiler.hpp
"
24
#include "
foedus/cxx11.hpp
"
25
#include "
foedus/storage/page.hpp
"
26
#include "
foedus/storage/storage_id.hpp
"
27
#include "
foedus/thread/thread_id.hpp
"
28
29
namespace
foedus
{
30
namespace
memory {
42
struct
LocalPageResolver
CXX11_FINAL
{
43
LocalPageResolver
() :
begin_
(0),
end_
(0),
base_
(
CXX11_NULLPTR
) {}
44
LocalPageResolver
(
storage::Page
* base,
PagePoolOffset
begin,
PagePoolOffset
end)
45
:
begin_
(begin),
end_
(end),
base_
(base) {}
46
47
// default assignment/copy-constructor is enough
48
50
PagePoolOffset
resolve_page
(
storage::Page
*page)
const
ALWAYS_INLINE
{
51
PagePoolOffset
offset = page -
base_
;
52
ASSERT_ND
(offset >=
begin_
);
53
ASSERT_ND
(offset <
end_
);
54
return
offset;
55
}
57
storage::Page
*
resolve_offset
(
PagePoolOffset
offset)
const
ALWAYS_INLINE
{
58
storage::Page
* page =
resolve_offset_newpage
(offset);
59
// this is NOT a new page, so we have sanity checks
60
storage::assert_valid_volatile_page
(page, offset);
61
return
page;
62
}
64
storage::Page
*
resolve_offset_newpage
(
PagePoolOffset
offset)
const
ALWAYS_INLINE
{
65
ASSERT_ND
(offset >=
begin_
);
66
ASSERT_ND
(offset <
end_
);
67
return
base_
+ offset;
68
}
69
71
PagePoolOffset
begin_
;
73
PagePoolOffset
end_
;
75
storage::Page
*
base_
;
76
};
77
92
struct
GlobalVolatilePageResolver
CXX11_FINAL
{
93
typedef
storage::Page
*
Base
;
94
enum
Constants
{
95
kMaxNumaNode
= 256,
96
};
97
GlobalVolatilePageResolver
() :
numa_node_count_
(0),
begin_
(0),
end_
(0) {}
98
GlobalVolatilePageResolver
(
const
Base *bases, uint16_t numa_node_count,
99
PagePoolOffset
begin,
PagePoolOffset
end)
100
:
numa_node_count_
(numa_node_count),
begin_
(begin),
end_
(end) {
101
ASSERT_ND
(numa_node_count <=
kMaxNumaNode
);
102
std::memcpy(
bases_
, bases,
sizeof
(Base) *
numa_node_count_
);
103
}
104
// default assignment/copy constructors are a bit wasteful when #numa node is small, thus:
105
GlobalVolatilePageResolver
(
const
GlobalVolatilePageResolver
&other) {
106
operator=
(other);
107
}
108
GlobalVolatilePageResolver
&
operator=
(
const
GlobalVolatilePageResolver
&other) {
109
ASSERT_ND
(other.
numa_node_count_
> 0);
110
ASSERT_ND
(other.
numa_node_count_
<=
kMaxNumaNode
);
111
ASSERT_ND
(other.
end_
> other.
begin_
);
112
numa_node_count_
= other.
numa_node_count_
;
113
begin_
= other.
begin_
;
114
end_
= other.
end_
;
115
std::memcpy(
bases_
, other.
bases_
,
sizeof
(Base) *
numa_node_count_
);
116
return
*
this
;
117
}
118
120
storage::Page
*
resolve_offset
(uint8_t numa_node,
PagePoolOffset
offset)
const
ALWAYS_INLINE
{
121
storage::Page
* page =
resolve_offset_newpage
(numa_node, offset);
122
// this is NOT a new page, so we have sanity checks
123
storage::assert_valid_volatile_page
(page, offset);
124
ASSERT_ND
(
storage::construct_volatile_page_pointer
(page->
get_header
().
page_id_
).get_numa_node()
125
== numa_node);
126
return
page;
127
}
129
storage::Page
*
resolve_offset
(
storage::VolatilePagePointer
page_pointer)
const
ALWAYS_INLINE
{
130
return
resolve_offset
(page_pointer.get_numa_node(), page_pointer.get_offset());
131
}
132
134
storage::Page
*
resolve_offset_newpage
(
135
uint8_t numa_node,
136
PagePoolOffset
offset)
const
ALWAYS_INLINE
{
137
ASSERT_ND
(numa_node <
numa_node_count_
);
138
ASSERT_ND
(offset >=
begin_
);
139
ASSERT_ND
(offset <
end_
);
140
storage::assert_aligned_page
(
bases_
[numa_node] + offset);
141
return
bases_
[numa_node] + offset;
142
}
144
storage::Page
*
resolve_offset_newpage
(
145
storage::VolatilePagePointer
page_pointer)
const
ALWAYS_INLINE
{
146
return
resolve_offset_newpage
(
147
page_pointer.get_numa_node(),
148
page_pointer.get_offset());
149
}
150
152
uint16_t
numa_node_count_
;
154
PagePoolOffset
begin_
;
156
PagePoolOffset
end_
;
157
159
Base
bases_
[
kMaxNumaNode
];
160
};
161
162
}
// namespace memory
163
}
// namespace foedus
164
#endif // FOEDUS_MEMORY_PAGE_RESOLVER_HPP_
foedus::storage::assert_aligned_page
void assert_aligned_page(const void *page)
Definition:
page.hpp:402
foedus::memory::GlobalVolatilePageResolver::resolve_offset
storage::Page * resolve_offset(uint8_t numa_node, PagePoolOffset offset) const __attribute__((always_inline))
Resolves offset plus NUMA node ID to storage::Page*.
Definition:
page_resolver.hpp:120
foedus::memory::GlobalVolatilePageResolver::GlobalVolatilePageResolver
GlobalVolatilePageResolver()
Definition:
page_resolver.hpp:97
foedus::memory::GlobalVolatilePageResolver::Constants
Constants
Definition:
page_resolver.hpp:94
storage_id.hpp
Definitions of IDs in this package and a few related constant values.
CXX11_NULLPTR
#define CXX11_NULLPTR
Used in public headers in place of "nullptr" of C++11.
Definition:
cxx11.hpp:132
cxx11.hpp
foedus::memory::GlobalVolatilePageResolver::operator=
GlobalVolatilePageResolver & operator=(const GlobalVolatilePageResolver &other)
Definition:
page_resolver.hpp:108
foedus
Root package of FOEDUS (Fast Optimistic Engine for Data Unification Services).
Definition:
assert_nd.hpp:44
foedus::memory::PagePoolOffset
uint32_t PagePoolOffset
Offset in PagePool that compactly represents the page address (unlike 8 bytes pointer).
Definition:
memory_id.hpp:44
thread_id.hpp
Typedefs of ID types used in thread package.
page.hpp
foedus::memory::GlobalVolatilePageResolver::numa_node_count_
uint16_t numa_node_count_
number of NUMA nodes in this engine.
Definition:
page_resolver.hpp:152
foedus::storage::VolatilePagePointer
Represents a pointer to a volatile page with modification count for preventing ABA.
Definition:
storage_id.hpp:194
foedus::memory::LocalPageResolver::resolve_offset_newpage
storage::Page * resolve_offset_newpage(PagePoolOffset offset) const __attribute__((always_inline))
As the name suggests, this version is for new pages, which don't have sanity checks.
Definition:
page_resolver.hpp:64
foedus::memory::GlobalVolatilePageResolver::begin_
PagePoolOffset begin_
where a valid page entry starts.
Definition:
page_resolver.hpp:154
foedus::memory::GlobalVolatilePageResolver::end_
PagePoolOffset end_
where a valid page entry ends.
Definition:
page_resolver.hpp:156
foedus::memory::GlobalVolatilePageResolver::Base
storage::Page * Base
Definition:
page_resolver.hpp:93
foedus::memory::LocalPageResolver::end_
PagePoolOffset end_
where a valid page entry ends.
Definition:
page_resolver.hpp:73
foedus::memory::GlobalVolatilePageResolver::resolve_offset
storage::Page * resolve_offset(storage::VolatilePagePointer page_pointer) const __attribute__((always_inline))
Resolves volatile page ID to storage::Page*.
Definition:
page_resolver.hpp:129
foedus::memory::LocalPageResolver::resolve_page
PagePoolOffset resolve_page(storage::Page *page) const __attribute__((always_inline))
Resolves storage::Page* to offset in this pool.
Definition:
page_resolver.hpp:50
foedus::storage::assert_valid_volatile_page
void assert_valid_volatile_page(const Page *page, uint32_t offset)
Definition:
page.hpp:407
foedus::memory::GlobalVolatilePageResolver::resolve_offset_newpage
storage::Page * resolve_offset_newpage(storage::VolatilePagePointer page_pointer) const __attribute__((always_inline))
As the name suggests, this version is for new pages, which don't have sanity checks.
Definition:
page_resolver.hpp:144
compiler.hpp
CXX11_FINAL
#define CXX11_FINAL
Used in public headers in place of "final" of C++11.
Definition:
cxx11.hpp:131
assert_nd.hpp
foedus::storage::Page
Just a marker to denote that the memory region represents a data page.
Definition:
page.hpp:334
foedus::memory::GlobalVolatilePageResolver::GlobalVolatilePageResolver
GlobalVolatilePageResolver(const GlobalVolatilePageResolver &other)
Definition:
page_resolver.hpp:105
foedus::memory::LocalPageResolver::resolve_offset
storage::Page * resolve_offset(PagePoolOffset offset) const __attribute__((always_inline))
Resolves offset in this pool to storage::Page*.
Definition:
page_resolver.hpp:57
foedus::memory::GlobalVolatilePageResolver::GlobalVolatilePageResolver
GlobalVolatilePageResolver(const Base *bases, uint16_t numa_node_count, PagePoolOffset begin, PagePoolOffset end)
Definition:
page_resolver.hpp:98
foedus::memory::GlobalVolatilePageResolver::resolve_offset_newpage
storage::Page * resolve_offset_newpage(uint8_t numa_node, PagePoolOffset offset) const __attribute__((always_inline))
As the name suggests, this version is for new pages, which don't have sanity checks.
Definition:
page_resolver.hpp:134
foedus::storage::construct_volatile_page_pointer
VolatilePagePointer construct_volatile_page_pointer(uint64_t word)
Definition:
storage_id.hpp:230
foedus::memory::LocalPageResolver
Resolves an offset in local (same NUMA node) page pool to a pointer and vice versa.
Definition:
page_resolver.hpp:42
foedus::memory::LocalPageResolver::LocalPageResolver
LocalPageResolver()
Definition:
page_resolver.hpp:43
foedus::memory::GlobalVolatilePageResolver
Resolves an offset in a volatile page pool to an actual pointer and vice versa.
Definition:
page_resolver.hpp:92
foedus::storage::Page::get_header
PageHeader & get_header()
At least the basic header exists in all pages.
Definition:
page.hpp:336
foedus::memory::LocalPageResolver::begin_
PagePoolOffset begin_
where a valid page entry starts.
Definition:
page_resolver.hpp:71
ASSERT_ND
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition:
assert_nd.hpp:72
ALWAYS_INLINE
#define ALWAYS_INLINE
A function suffix to hint that the function should always be inlined.
Definition:
compiler.hpp:106
foedus::memory::LocalPageResolver::base_
storage::Page * base_
base address to calculate from/to offset.
Definition:
page_resolver.hpp:75
foedus::memory::GlobalVolatilePageResolver::bases_
Base bases_[kMaxNumaNode]
base address to calculate from/to offset.
Definition:
page_resolver.hpp:159
foedus::memory::GlobalVolatilePageResolver::kMaxNumaNode
Definition:
page_resolver.hpp:95
foedus::storage::PageHeader::page_id_
uint64_t page_id_
Page ID of this page.
Definition:
page.hpp:191
foedus::memory::LocalPageResolver::LocalPageResolver
LocalPageResolver(storage::Page *base, PagePoolOffset begin, PagePoolOffset end)
Definition:
page_resolver.hpp:44
foedus-core
include
foedus
memory
page_resolver.hpp
Generated by
1.8.10