Skip to content

Commit 6672b97

Browse files
authored
Merge pull request #87 from artiomn/master
Bus creation fix: #48
2 parents 78f10a2 + e1fe215 commit 6672b97

7 files changed

Lines changed: 64 additions & 41 deletions

File tree

knp/core-library/impl/backend.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,20 @@ namespace knp::core
2929
{
3030

3131
Backend::Backend()
32-
: message_bus_(knp::core::MessageBus::construct_bus()), message_endpoint_{message_bus_.create_endpoint()}
32+
: message_bus_{knp::core::MessageBus::construct_bus()}, message_endpoint_(message_bus_->create_endpoint())
3333
{
3434
}
3535

3636

3737
Backend::Backend(MessageBus&& message_bus)
38-
: message_bus_(std::move(message_bus)), message_endpoint_{message_bus_.create_endpoint()}
38+
: message_bus_{std::make_shared<knp::core::MessageBus>(std::move(message_bus))},
39+
message_endpoint_(message_bus_->create_endpoint())
40+
{
41+
}
42+
43+
44+
Backend::Backend(std::shared_ptr<MessageBus> message_bus)
45+
: message_bus_(message_bus), message_endpoint_(message_bus_->create_endpoint())
3946
{
4047
}
4148

knp/core-library/impl/message_bus.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,28 @@
3232

3333
namespace knp::core
3434
{
35+
struct make_shared_enabler : public MessageBus
36+
{
37+
explicit make_shared_enabler(std::unique_ptr<messaging::impl::MessageBusImpl> &&impl) : MessageBus(std::move(impl))
38+
{
39+
}
40+
};
41+
42+
3543
MessageBus::~MessageBus() = default;
3644

3745
MessageBus::MessageBus(MessageBus &&) noexcept = default;
3846

39-
MessageBus MessageBus::construct_cpu_bus()
47+
48+
std::shared_ptr<MessageBus> MessageBus::construct_cpu_bus()
4049
{
41-
return MessageBus(std::make_unique<messaging::impl::MessageBusCPUImpl>());
50+
return std::make_shared<make_shared_enabler>(std::make_unique<messaging::impl::MessageBusCPUImpl>());
4251
}
4352

4453

45-
MessageBus MessageBus::construct_zmq_bus()
54+
std::shared_ptr<MessageBus> MessageBus::construct_zmq_bus()
4655
{
47-
return MessageBus(std::make_unique<messaging::impl::MessageBusZMQImpl>());
56+
return std::make_shared<make_shared_enabler>(std::make_unique<messaging::impl::MessageBusZMQImpl>());
4857
}
4958

5059

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: 5 additions & 5 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.
@@ -103,15 +103,15 @@ class MessageBus
103103
*/
104104
size_t route_messages();
105105

106-
private:
106+
protected:
107107
/**
108108
* @brief Message bus constructor with a specialized implementation.
109109
* @param impl message bus implementation.
110110
* @note Currently two implementations are available: ZMQ and CPU.
111111
*/
112112
explicit MessageBus(std::unique_ptr<messaging::impl::MessageBusImpl> &&impl);
113113

114-
114+
private:
115115
/**
116116
* @brief Message bus implementation.
117117
*/

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)