Skip to content

Commit 9de2660

Browse files
committed
Move per type data to a meta struct
1 parent 038c727 commit 9de2660

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>
@@ -34,10 +35,8 @@ template <class Value>
3435
trade_v1::Private::access_t<Value> *
3536
trade_v1::Private::insert(transaction_base_t *transaction,
3637
atom_t<Value> *atom) {
37-
return static_cast<access_t<Value> *>(insert(transaction,
38-
atom,
39-
alignof(access_t<Value>) - 1,
40-
sizeof(access_t<Value>)));
38+
return static_cast<access_t<Value> *>(
39+
insert(transaction, atom, meta<Value>::s_instance));
4140
}
4241

4342
template <class Value>
@@ -46,7 +45,6 @@ Value trade_v1::Private::load(const atom_t<Value> &atom) {
4645
if (transaction->m_alloc) {
4746
auto access = insert(transaction, const_cast<atom_t<Value> *>(&atom));
4847
if (access->m_state == INITIAL) {
49-
access->m_destroy = destroy<Value>;
5048
auto &lock = s_locks[access->m_lock_ix];
5149
auto s = lock.m_clock.load();
5250
if (transaction->m_start < s)
@@ -94,7 +92,6 @@ Value &trade_v1::Private::store(atom_t<Value> &atom, Forwardable &&value) {
9492
switch (access->m_state) {
9593
case INITIAL:
9694
new (&access->m_current) Value(std::forward<Forwardable>(value));
97-
access->m_destroy = destroy<Value>;
9895
access->m_state = WRITTEN;
9996
break;
10097
case READ:
@@ -112,7 +109,6 @@ template <class Value> Value &trade_v1::Private::ref(atom_t<Value> &atom) {
112109
auto access = insert(transaction, &atom);
113110
switch (access->m_state) {
114111
case INITIAL: {
115-
access->m_destroy = destroy<Value>;
116112
auto &lock = s_locks[access->m_lock_ix];
117113
auto s = lock.m_clock.load();
118114
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)