Skip to content

Commit d6f4093

Browse files
committed
Move per type data to a meta struct
1 parent 488e359 commit d6f4093

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/config.hpp"
44
#include "trade_v1/private/access-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 "molecular_v1/backoff.hpp"
@@ -36,10 +37,8 @@ template <class Value>
3637
trade_v1::Private::access_t<Value> *
3738
trade_v1::Private::insert(transaction_base_t *transaction,
3839
atom_t<Value> *atom) {
39-
return static_cast<access_t<Value> *>(insert(transaction,
40-
atom,
41-
alignof(access_t<Value>) - 1,
42-
sizeof(access_t<Value>)));
40+
return static_cast<access_t<Value> *>(
41+
insert(transaction, atom, meta<Value>::s_instance));
4342
}
4443

4544
template <class Value>
@@ -48,7 +47,6 @@ Value trade_v1::Private::load(const atom_t<Value> &atom) {
4847
if (transaction->m_alloc) {
4948
auto access = insert(transaction, const_cast<atom_t<Value> *>(&atom));
5049
if (access->m_state == INITIAL) {
51-
access->m_destroy = destroy<Value>;
5250
auto &lock = s_locks[access->m_lock_ix];
5351
auto s = lock.m_clock.load();
5452
if (transaction->m_start < s)
@@ -96,7 +94,6 @@ Value &trade_v1::Private::store(atom_t<Value> &atom, Forwardable &&value) {
9694
switch (access->m_state) {
9795
case INITIAL:
9896
new (&access->m_current) Value(std::forward<Forwardable>(value));
99-
access->m_destroy = destroy<Value>;
10097
access->m_state = WRITTEN;
10198
break;
10299
case READ:
@@ -114,7 +111,6 @@ template <class Value> Value &trade_v1::Private::ref(atom_t<Value> &atom) {
114111
auto access = insert(transaction, &atom);
115112
switch (access->m_state) {
116113
case INITIAL: {
117-
access->m_destroy = destroy<Value>;
118114
auto &lock = s_locks[access->m_lock_ix];
119115
auto s = lock.m_clock.load();
120116
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
@@ -54,6 +54,11 @@ class Private {
5454

5555
//
5656

57+
struct meta_t;
58+
template <class Value> struct meta;
59+
60+
//
61+
5762
using state_t = uint8_t;
5863
static constexpr state_t INITIAL = 0, READ = 1, WRITTEN = 2;
5964

@@ -86,8 +91,7 @@ class Private {
8691

8792
static access_base_t *insert(transaction_base_t *transaction,
8893
atom_mono_t *atom,
89-
size_t align_m1,
90-
size_t size);
94+
const meta_t &meta);
9195

9296
template <class Value>
9397
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>
@@ -153,20 +154,20 @@ struct trade_v1::Private::Static {
153154
trade_v1::Private::access_base_t *
154155
trade_v1::Private::insert(transaction_base_t *transaction,
155156
atom_mono_t *access_atom,
156-
size_t align_m1,
157-
size_t size) {
157+
const meta_t &meta) {
158158
auto root = transaction->m_accesses;
159159

160160
auto access_ix = lock_ix_of(access_atom);
161161

162162
if (!root) {
163-
auto access = Static::alloc_align(transaction, align_m1);
164-
if (Static::alloc_limit(transaction, access, size)) {
163+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
164+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
165165
access->m_children[0] = nullptr;
166166
access->m_children[1] = nullptr;
167167
access->m_atom = access_atom;
168168
access->m_state = INITIAL;
169169
access->m_lock_ix = access_ix;
170+
access->m_destroy = meta.m_destroy;
170171
return transaction->m_accesses = access;
171172
} else {
172173
throw transaction;
@@ -188,13 +189,14 @@ trade_v1::Private::insert(transaction_base_t *transaction,
188189
*side_near[0] = nullptr;
189190
*side_near[1] = root->m_children[1];
190191
root->m_children[1] = side_root[1];
191-
auto access = Static::alloc_align(transaction, align_m1);
192-
if (Static::alloc_limit(transaction, access, size)) {
192+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
193+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
193194
access->m_children[0] = side_root[0];
194195
access->m_children[1] = root;
195196
access->m_atom = access_atom;
196197
access->m_state = INITIAL;
197198
access->m_lock_ix = access_ix;
199+
access->m_destroy = meta.m_destroy;
198200
return transaction->m_accesses = access;
199201
} else {
200202
root->m_children[0] = side_root[0];
@@ -213,13 +215,15 @@ trade_v1::Private::insert(transaction_base_t *transaction,
213215
if (!next) {
214216
*side_near[0] = nullptr;
215217
*side_near[1] = root;
216-
auto access = Static::alloc_align(transaction, align_m1);
217-
if (Static::alloc_limit(transaction, access, size)) {
218+
auto access =
219+
Static::alloc_align(transaction, meta.m_access_align_m1);
220+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
218221
access->m_children[0] = side_root[0];
219222
access->m_children[1] = side_root[1];
220223
access->m_atom = access_atom;
221224
access->m_state = INITIAL;
222225
access->m_lock_ix = access_ix;
226+
access->m_destroy = meta.m_destroy;
223227
return transaction->m_accesses = access;
224228
} else {
225229
root->m_children[0] = side_root[0];
@@ -239,13 +243,14 @@ trade_v1::Private::insert(transaction_base_t *transaction,
239243
*side_near[0] = root->m_children[0];
240244
*side_near[1] = nullptr;
241245
root->m_children[0] = side_root[0];
242-
auto access = Static::alloc_align(transaction, align_m1);
243-
if (Static::alloc_limit(transaction, access, size)) {
246+
auto access = Static::alloc_align(transaction, meta.m_access_align_m1);
247+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
244248
access->m_children[0] = root;
245249
access->m_children[1] = side_root[1];
246250
access->m_atom = access_atom;
247251
access->m_state = INITIAL;
248252
access->m_lock_ix = access_ix;
253+
access->m_destroy = meta.m_destroy;
249254
return transaction->m_accesses = access;
250255
} else {
251256
root->m_children[1] = side_root[1];
@@ -264,13 +269,15 @@ trade_v1::Private::insert(transaction_base_t *transaction,
264269
if (!next) {
265270
*side_near[0] = root;
266271
*side_near[1] = nullptr;
267-
auto access = Static::alloc_align(transaction, align_m1);
268-
if (Static::alloc_limit(transaction, access, size)) {
272+
auto access =
273+
Static::alloc_align(transaction, meta.m_access_align_m1);
274+
if (Static::alloc_limit(transaction, access, meta.m_access_size)) {
269275
access->m_children[0] = side_root[0];
270276
access->m_children[1] = side_root[1];
271277
access->m_atom = access_atom;
272278
access->m_state = INITIAL;
273279
access->m_lock_ix = access_ix;
280+
access->m_destroy = meta.m_destroy;
274281
return transaction->m_accesses = access;
275282
} else {
276283
root->m_children[1] = side_root[1];

0 commit comments

Comments
 (0)