Skip to content

Commit 25944fc

Browse files
committed
Bus creation fix: #48
1 parent ecc5269 commit 25944fc

7 files changed

Lines changed: 60 additions & 39 deletions

File tree

knp/core-library/impl/backend.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,28 @@
2828
namespace knp::core
2929
{
3030

31+
template <class T>
32+
T& as_lvalue(T&& t)
33+
{
34+
return t;
35+
}
36+
37+
3138
Backend::Backend()
32-
: message_bus_(knp::core::MessageBus::construct_bus()), message_endpoint_{message_bus_.create_endpoint()}
39+
: message_bus_{knp::core::MessageBus::construct_bus()}, message_endpoint_(message_bus_->create_endpoint())
3340
{
3441
}
3542

3643

3744
Backend::Backend(MessageBus&& message_bus)
38-
: message_bus_(std::move(message_bus)), message_endpoint_{message_bus_.create_endpoint()}
45+
: message_bus_{std::make_shared<knp::core::MessageBus>(std::move(message_bus))},
46+
message_endpoint_(message_bus_->create_endpoint())
47+
{
48+
}
49+
50+
51+
Backend::Backend(std::shared_ptr<MessageBus> message_bus)
52+
: message_bus_(message_bus), message_endpoint_(message_bus_->create_endpoint())
3953
{
4054
}
4155

knp/core-library/impl/message_bus.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ MessageBus::~MessageBus() = default;
3636

3737
MessageBus::MessageBus(MessageBus &&) noexcept = default;
3838

39-
MessageBus MessageBus::construct_cpu_bus()
39+
std::shared_ptr<MessageBus> MessageBus::construct_cpu_bus()
4040
{
41-
return MessageBus(std::make_unique<messaging::impl::MessageBusCPUImpl>());
41+
return std::shared_ptr<MessageBus>(new MessageBus(std::make_unique<messaging::impl::MessageBusCPUImpl>()));
4242
}
4343

4444

45-
MessageBus MessageBus::construct_zmq_bus()
45+
std::shared_ptr<MessageBus> MessageBus::construct_zmq_bus()
4646
{
47-
return MessageBus(std::make_unique<messaging::impl::MessageBusZMQImpl>());
47+
return std::shared_ptr<MessageBus>(new MessageBus(std::make_unique<messaging::impl::MessageBusZMQImpl>()));
4848
}
4949

5050

knp/core-library/include/knp/core/backend.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,13 @@ class BOOST_SYMBOL_VISIBLE Backend
195195
* @brief Get message bus used by backend.
196196
* @return reference to message bus.
197197
*/
198-
[[nodiscard]] MessageBus &get_message_bus() { return message_bus_; }
198+
[[nodiscard]] MessageBus &get_message_bus() { return *message_bus_; }
199199
/**
200200
* @brief Get message bus used by backend.
201201
* @note Constant method.
202202
* @return reference to message bus.
203203
*/
204-
[[nodiscard]] const MessageBus &get_message_bus() const { return message_bus_; }
204+
[[nodiscard]] const MessageBus &get_message_bus() const { return *message_bus_; }
205205

206206
/**
207207
* @brief Get message endpoint.
@@ -368,10 +368,16 @@ class BOOST_SYMBOL_VISIBLE Backend
368368

369369
/**
370370
* @brief Backend constructor with custom message bus implementation.
371-
* @param message_bus message bus.
371+
* @param message_bus message bus shared pointer.
372372
*/
373373
explicit Backend(MessageBus &&message_bus);
374374

375+
/**
376+
* @brief Backend constructor with custom message bus implementation.
377+
* @param message_bus message bus.
378+
*/
379+
380+
explicit Backend(std::shared_ptr<MessageBus> message_bus);
375381
/**
376382
* @brief Get the current step and increase the step number.
377383
* @return step number.
@@ -386,7 +392,7 @@ class BOOST_SYMBOL_VISIBLE Backend
386392
std::atomic<bool> initialized_ = false;
387393
volatile std::atomic<bool> started_ = false;
388394
std::vector<std::unique_ptr<Device>> devices_;
389-
MessageBus message_bus_;
395+
std::shared_ptr<MessageBus> message_bus_;
390396
MessageEndpoint message_endpoint_;
391397
core::Step step_ = 0;
392398
};

knp/core-library/include/knp/core/message_bus.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,19 @@ class MessageBus
5353
* @brief Create a CPU-based message bus.
5454
* @return message bus.
5555
*/
56-
static MessageBus construct_cpu_bus();
56+
static std::shared_ptr<MessageBus> construct_cpu_bus();
5757

5858
/**
5959
* @brief Create a ZMQ-based message bus.
6060
* @return message bus.
6161
*/
62-
static MessageBus construct_zmq_bus();
62+
static std::shared_ptr<MessageBus> construct_zmq_bus();
6363

6464
/**
6565
* @brief Create a message bus with default implementation.
6666
* @return message bus.
6767
*/
68-
static MessageBus construct_bus() { return construct_cpu_bus(); }
68+
static std::shared_ptr<MessageBus> construct_bus() { return construct_cpu_bus(); }
6969

7070
/**
7171
* @brief Default message bus constructor is deleted.

knp/tests/core/message_bus_test.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,10 @@ TEST(MessageBusSuite, AddSubscriptionMessage)
4545
TEST(MessageBusSuite, SubscribeUnsubscribe)
4646
{
4747
// Test that adding and removing subscriptions works correctly.
48-
knp::core::MessageBus bus = knp::core::MessageBus::construct_bus();
49-
auto entry_point{bus.create_endpoint()};
48+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_bus();
49+
auto entry_point{bus->create_endpoint()};
5050
const knp::core::UID sender{true}, receiver{true}, false_uid{true};
51+
5152
// Add subscription for spike messages.
5253
entry_point.subscribe<knp::core::messaging::SpikeMessage>(receiver, {sender});
5354
// Try removing subscription with a wrong ID. This should return false.
@@ -64,18 +65,18 @@ TEST(MessageBusSuite, SubscribeUnsubscribe)
6465
TEST(MessageBusSuite, CreateBusAndEndpointZMQ)
6566
{
6667
using SpikeMessage = knp::core::messaging::SpikeMessage;
67-
knp::core::MessageBus bus = knp::core::MessageBus::construct_zmq_bus();
68+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_zmq_bus();
6869

69-
auto ep1{bus.create_endpoint()};
70-
auto ep2{bus.create_endpoint()};
70+
auto ep1{bus->create_endpoint()};
71+
auto ep2{bus->create_endpoint()};
7172

7273
SpikeMessage msg{{knp::core::UID{}}, {1, 2, 3, 4, 5}};
7374

7475
auto &subscription = ep2.subscribe<SpikeMessage>(knp::core::UID(), {msg.header_.sender_uid_});
7576

7677
ep1.send_message(msg);
7778
// Message ID and message data.
78-
EXPECT_EQ(bus.route_messages(), 2);
79+
EXPECT_EQ(bus->route_messages(), 2);
7980
ep2.receive_all_messages();
8081

8182
const auto &msgs = subscription.get_messages();
@@ -89,18 +90,18 @@ TEST(MessageBusSuite, CreateBusAndEndpointZMQ)
8990
TEST(MessageBusSuite, CreateBusAndEndpointCPU)
9091
{
9192
using SpikeMessage = knp::core::messaging::SpikeMessage;
92-
knp::core::MessageBus bus = knp::core::MessageBus::construct_cpu_bus();
93+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_cpu_bus();
9394

94-
auto ep1{bus.create_endpoint()};
95-
auto ep2{bus.create_endpoint()};
95+
auto ep1{bus->create_endpoint()};
96+
auto ep2{bus->create_endpoint()};
9697

9798
SpikeMessage msg{{knp::core::UID{}}, {1, 2, 3, 4, 5}};
9899

99100
auto &subscription = ep2.subscribe<SpikeMessage>(knp::core::UID(), {msg.header_.sender_uid_});
100101

101102
ep1.send_message(msg);
102103
// Message ID and message data.
103-
EXPECT_EQ(bus.route_messages(), 1);
104+
EXPECT_EQ(bus->route_messages(), 1);
104105
ep2.receive_all_messages();
105106

106107
const auto &msgs = subscription.get_messages();
@@ -114,9 +115,9 @@ TEST(MessageBusSuite, CreateBusAndEndpointCPU)
114115
TEST(MessageBusSuite, SynapticImpactMessageSendZMQ)
115116
{
116117
using SynapticImpactMessage = knp::core::messaging::SynapticImpactMessage;
117-
knp::core::MessageBus bus = knp::core::MessageBus::construct_zmq_bus();
118+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_zmq_bus();
118119

119-
auto ep1{bus.create_endpoint()};
120+
auto ep1{bus->create_endpoint()};
120121
knp::synapse_traits::OutputType synapse_type = knp::synapse_traits::OutputType::EXCITATORY;
121122
SynapticImpactMessage msg{
122123
{knp::core::UID{}},
@@ -129,7 +130,7 @@ TEST(MessageBusSuite, SynapticImpactMessageSendZMQ)
129130

130131
ep1.send_message(msg);
131132
// Message ID and message data.
132-
EXPECT_EQ(bus.route_messages(), 2);
133+
EXPECT_EQ(bus->route_messages(), 2);
133134
ep1.receive_all_messages();
134135

135136
const auto &msgs = subscription.get_messages();
@@ -146,9 +147,9 @@ TEST(MessageBusSuite, SynapticImpactMessageSendZMQ)
146147
TEST(MessageBusSuite, SynapticImpactMessageSendCPU)
147148
{
148149
using SynapticImpactMessage = knp::core::messaging::SynapticImpactMessage;
149-
knp::core::MessageBus bus = knp::core::MessageBus::construct_cpu_bus();
150+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_cpu_bus();
150151

151-
auto ep1{bus.create_endpoint()};
152+
auto ep1{bus->create_endpoint()};
152153
knp::synapse_traits::OutputType synapse_type = knp::synapse_traits::OutputType::EXCITATORY;
153154
SynapticImpactMessage msg{
154155
{knp::core::UID{}},
@@ -161,7 +162,7 @@ TEST(MessageBusSuite, SynapticImpactMessageSendCPU)
161162

162163
ep1.send_message(msg);
163164
// Message ID and message data.
164-
EXPECT_EQ(bus.route_messages(), 1);
165+
EXPECT_EQ(bus->route_messages(), 1);
165166
ep1.receive_all_messages();
166167

167168
const auto &msgs = subscription.get_messages();

knp/tests/framework/input_test.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ TEST(InputSuite, IndexConverterTest)
6363

6464
TEST(InputSuite, ChannelTest)
6565
{
66-
knp::core::MessageBus bus = knp::core::MessageBus::construct_bus();
67-
auto endpoint = bus.create_endpoint();
66+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_bus();
67+
auto endpoint = bus->create_endpoint();
6868

6969
auto converter = knp::framework::io::input::SequenceConverter<int>{
7070
std::make_unique<std::stringstream>(), knp::framework::io::input::interpret_as_bool<int>, 10};
7171
knp::framework::io::input::InputChannel channel{
72-
knp::core::UID(), bus.create_endpoint(), [&converter](auto size) { return converter(); }};
72+
knp::core::UID(), bus->create_endpoint(), [&converter](auto size) { return converter(); }};
7373

7474
auto &stream = dynamic_cast<std::stringstream &>(converter.get_stream());
7575

@@ -86,7 +86,7 @@ TEST(InputSuite, ChannelTest)
8686
channel.send(send_time);
8787

8888
// Process messages.
89-
bus.route_messages();
89+
bus->route_messages();
9090
endpoint.receive_all_messages();
9191

9292
auto messages = endpoint.unload_messages<knp::core::messaging::SpikeMessage>(output_uid);

knp/tests/framework/output_test.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ TEST(OutputSuite, ConverterTest)
5757

5858
TEST(OutputSuite, ChannelTest)
5959
{
60-
knp::core::MessageBus bus = knp::core::MessageBus::construct_bus();
61-
auto endpoint = bus.create_endpoint();
60+
std::shared_ptr<knp::core::MessageBus> bus = knp::core::MessageBus::construct_bus();
61+
auto endpoint = bus->create_endpoint();
6262
// New random UID.
6363
knp::core::UID sender_uid;
6464

@@ -73,19 +73,19 @@ TEST(OutputSuite, ChannelTest)
7373
};
7474

7575
// Initialize counting channel.
76-
auto endpoint_1 = bus.create_endpoint();
76+
auto endpoint_1 = bus->create_endpoint();
7777
auto c1_uid = knp::core::UID();
7878
endpoint_1.subscribe<knp::core::messaging::SpikeMessage>(c1_uid, {sender_uid});
7979
knp::framework::io::output::OutputChannel channel_count{c1_uid, std::move(endpoint_1)};
8080

8181
// Initialize neuron set channel.
82-
auto endpoint_2 = bus.create_endpoint();
82+
auto endpoint_2 = bus->create_endpoint();
8383
auto c2_uid = knp::core::UID();
8484
endpoint_2.subscribe<knp::core::messaging::SpikeMessage>(c2_uid, {sender_uid});
8585
knp::framework::io::output::OutputChannel channel_set{c2_uid, std::move(endpoint_2)};
8686

8787
// Create a custom "max activations by neuron" channel.
88-
auto endpoint_3 = bus.create_endpoint();
88+
auto endpoint_3 = bus->create_endpoint();
8989
auto c3_uid = knp::core::UID();
9090
endpoint_3.subscribe<knp::core::messaging::SpikeMessage>(c3_uid, {sender_uid});
9191
knp::framework::io::output::OutputChannel channel_max{c3_uid, std::move(endpoint_3)};
@@ -99,7 +99,7 @@ TEST(OutputSuite, ChannelTest)
9999
endpoint.send_message(knp::core::messaging::SpikeMessage{{sender_uid, 1}, {1, 3, 8}});
100100
endpoint.send_message(knp::core::messaging::SpikeMessage{{sender_uid, 3}, {1, 4, 10}});
101101
endpoint.send_message(knp::core::messaging::SpikeMessage{{sender_uid, 5}, {1, 4, 7, 12}});
102-
bus.route_messages();
102+
bus->route_messages();
103103
endpoint.receive_all_messages();
104104

105105
// Use channels.

0 commit comments

Comments
 (0)