Skip to content

Commit 64dcdb6

Browse files
committed
Move per type data to a meta struct
1 parent ebce9f0 commit 64dcdb6

File tree

4 files changed

+47
-21
lines changed

4 files changed

+47
-21
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include "trade_v1/private/access.hpp"
4+
5+
struct trade_v1::Private::meta_t {
6+
size_t m_access_align_m1;
7+
size_t m_access_size;
8+
destroy_t m_destroy;
9+
};
10+
11+
template <class Value> struct trade_v1::Private::meta {
12+
static const meta_t s_instance;
13+
};
14+
15+
template <class Value>
16+
const trade_v1::Private::meta_t trade_v1::Private::meta<Value>::s_instance = {
17+
alignof(access_t<Value>) - 1,
18+
sizeof(access_t<Value>),
19+
Private::destroy<Value>};

provides/include/trade_v1/private/private-methods.hpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "trade_v1/private/access-methods.hpp"
44
#include "trade_v1/private/backoff-methods.hpp"
55
#include "trade_v1/private/lock.hpp"
6+
#include "trade_v1/private/meta.hpp"
67
#include "trade_v1/private/transaction-methods.hpp"
78

89
#include <utility>
@@ -33,10 +34,8 @@ template <class Value>
3334
trade_v1::Private::access_t<Value> *
3435
trade_v1::Private::insert(transaction_base_t *transaction,
3536
atom_t<Value> *atom) {
36-
return static_cast<access_t<Value> *>(insert(transaction,
37-
atom,
38-
alignof(access_t<Value>) - 1,
39-
sizeof(access_t<Value>)));
37+
return static_cast<access_t<Value> *>(
38+
insert(transaction, atom, meta<Value>::s_instance));
4039
}
4140

4241
template <class Value>
@@ -45,7 +44,6 @@ Value trade_v1::Private::load(const atom_t<Value> &atom) {
4544
if (transaction->m_alloc) {
4645
auto access = insert(transaction, const_cast<atom_t<Value> *>(&atom));
4746
if (access->m_state == INITIAL) {
48-
access->m_destroy = destroy<Value>;
4947
auto &lock = s_locks[access->m_lock_ix];
5048
auto s = lock.m_clock.load();
5149
if (transaction->m_start < s)
@@ -93,7 +91,6 @@ Value &trade_v1::Private::store(atom_t<Value> &atom, Forwardable &&value) {
9391
switch (access->m_state) {
9492
case INITIAL:
9593
new (&access->m_current) Value(std::forward<Forwardable>(value));
96-
access->m_destroy = destroy<Value>;
9794
access->m_state = WRITTEN;
9895
break;
9996
case READ:
@@ -111,7 +108,6 @@ template <class Value> Value &trade_v1::Private::ref(atom_t<Value> &atom) {
111108
auto access = insert(transaction, &atom);
112109
switch (access->m_state) {
113110
case INITIAL: {
114-
access->m_destroy = destroy<Value>;
115111
auto &lock = s_locks[access->m_lock_ix];
116112
auto s = lock.m_clock.load();
117113
if (transaction->m_start < s)

provides/include/trade_v1/private/private.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ class Private {
5656

5757
//
5858

59+
struct meta_t;
60+
template <class Value> struct meta;
61+
62+
//
63+
5964
using state_t = uint8_t;
6065
static constexpr state_t INITIAL = 0, READ = 1, WRITTEN = 2;
6166

@@ -88,8 +93,7 @@ class Private {
8893

8994
static access_base_t *insert(transaction_base_t *transaction,
9095
atom_mono_t *atom,
91-
size_t align_m1,
92-
size_t size);
96+
const meta_t &meta);
9397

9498
template <class Value>
9599
static access_t<Value> *insert(transaction_base_t *transaction,

provides/library/trade.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "trade_v1/trade.hpp"
2+
#include "trade_v1/private/meta.hpp"
23

34
#include <condition_variable>
45
#include <cstdio>
@@ -155,20 +156,20 @@ struct trade_v1::Private::Static {
155156
trade_v1::Private::access_base_t *
156157
trade_v1::Private::insert(transaction_base_t *transaction,
157158
atom_mono_t *access_atom,
158-
size_t align_m1,
159-
size_t size) {
159+
const meta_t &meta) {
160160
auto root = transaction->m_accesses;
161161

162162
auto access_ix = lock_ix_of(access_atom);
163163

164164
if (!root) {
165-
auto access = Static::alloc_align(transaction, align_m1);
166-
if (Static::alloc_limit(transaction, access, size)) {
165+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
166+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
167167
access->m_children[0] = nullptr;
168168
access->m_children[1] = nullptr;
169169
access->m_atom = access_atom;
170170
access->m_state = INITIAL;
171171
access->m_lock_ix = access_ix;
172+
access->m_destroy = meta.m_destroy;
172173
return transaction->m_accesses = access;
173174
} else {
174175
throw transaction;
@@ -190,13 +191,14 @@ trade_v1::Private::insert(transaction_base_t *transaction,
190191
*side_near[0] = nullptr;
191192
*side_near[1] = root->m_children[1];
192193
root->m_children[1] = side_root[1];
193-
auto access = Static::alloc_align(transaction, align_m1);
194-
if (Static::alloc_limit(transaction, access, size)) {
194+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
195+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
195196
access->m_children[0] = side_root[0];
196197
access->m_children[1] = root;
197198
access->m_atom = access_atom;
198199
access->m_state = INITIAL;
199200
access->m_lock_ix = access_ix;
201+
access->m_destroy = meta.m_destroy;
200202
return transaction->m_accesses = access;
201203
} else {
202204
root->m_children[0] = side_root[0];
@@ -215,13 +217,15 @@ trade_v1::Private::insert(transaction_base_t *transaction,
215217
if (!next) {
216218
*side_near[0] = nullptr;
217219
*side_near[1] = root;
218-
auto access = Static::alloc_align(transaction, align_m1);
219-
if (Static::alloc_limit(transaction, access, size)) {
220+
auto access =
221+
Static::alloc_align(transaction, meta.m_access_align_m1);
222+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
220223
access->m_children[0] = side_root[0];
221224
access->m_children[1] = side_root[1];
222225
access->m_atom = access_atom;
223226
access->m_state = INITIAL;
224227
access->m_lock_ix = access_ix;
228+
access->m_destroy = meta.m_destroy;
225229
return transaction->m_accesses = access;
226230
} else {
227231
root->m_children[0] = side_root[0];
@@ -241,13 +245,14 @@ trade_v1::Private::insert(transaction_base_t *transaction,
241245
*side_near[0] = root->m_children[0];
242246
*side_near[1] = nullptr;
243247
root->m_children[0] = side_root[0];
244-
auto access = Static::alloc_align(transaction, align_m1);
245-
if (Static::alloc_limit(transaction, access, size)) {
248+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
249+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
246250
access->m_children[0] = root;
247251
access->m_children[1] = side_root[1];
248252
access->m_atom = access_atom;
249253
access->m_state = INITIAL;
250254
access->m_lock_ix = access_ix;
255+
access->m_destroy = meta.m_destroy;
251256
return transaction->m_accesses = access;
252257
} else {
253258
root->m_children[1] = side_root[1];
@@ -266,13 +271,15 @@ trade_v1::Private::insert(transaction_base_t *transaction,
266271
if (!next) {
267272
*side_near[0] = root;
268273
*side_near[1] = nullptr;
269-
auto access = Static::alloc_align(transaction, align_m1);
270-
if (Static::alloc_limit(transaction, access, size)) {
274+
auto access =
275+
Static::alloc_align(transaction, meta.m_access_align_m1);
276+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
271277
access->m_children[0] = side_root[0];
272278
access->m_children[1] = side_root[1];
273279
access->m_atom = access_atom;
274280
access->m_state = INITIAL;
275281
access->m_lock_ix = access_ix;
282+
access->m_destroy = meta.m_destroy;
276283
return transaction->m_accesses = access;
277284
} else {
278285
root->m_children[1] = side_root[1];

0 commit comments

Comments
 (0)