Skip to content

Commit 8ca99c7

Browse files
authored
[ntcore] Change internal interfaces and messages to use UIDs (#7189)
Also make Handle functions constexpr.
1 parent 59bc53b commit 8ca99c7

26 files changed

+435
-500
lines changed

ntcore/src/main/native/cpp/Handle.h

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ class Handle {
3333
static_assert(kTypeMax <= wpi::kHandleTypeHALBase);
3434
enum { kIndexMax = 0xfffff };
3535

36-
explicit Handle(NT_Handle handle) : m_handle(handle) {}
37-
operator NT_Handle() const { return m_handle; }
36+
constexpr explicit Handle(NT_Handle handle) : m_handle(handle) {}
37+
constexpr operator NT_Handle() const { return m_handle; }
3838

39-
NT_Handle handle() const { return m_handle; }
39+
constexpr NT_Handle handle() const { return m_handle; }
4040

41-
Handle(int inst, int index, Type type) {
41+
constexpr Handle(int inst, int index, Type type) {
4242
if (inst < 0 || index < 0) {
4343
m_handle = 0;
4444
return;
@@ -47,16 +47,22 @@ class Handle {
4747
(index & 0xfffff);
4848
}
4949

50-
unsigned int GetIndex() const {
50+
constexpr unsigned int GetIndex() const {
5151
return static_cast<unsigned int>(m_handle) & 0xfffff;
5252
}
53-
Type GetType() const {
53+
constexpr Type GetType() const {
5454
return static_cast<Type>((static_cast<int>(m_handle) >> 24) & 0x7f);
5555
}
56-
int GetInst() const { return (static_cast<int>(m_handle) >> 20) & 0xf; }
57-
bool IsType(Type type) const { return type == GetType(); }
58-
int GetTypedIndex(Type type) const { return IsType(type) ? GetIndex() : -1; }
59-
int GetTypedInst(Type type) const { return IsType(type) ? GetInst() : -1; }
56+
constexpr int GetInst() const {
57+
return (static_cast<int>(m_handle) >> 20) & 0xf;
58+
}
59+
constexpr bool IsType(Type type) const { return type == GetType(); }
60+
constexpr int GetTypedIndex(Type type) const {
61+
return IsType(type) ? GetIndex() : -1;
62+
}
63+
constexpr int GetTypedInst(Type type) const {
64+
return IsType(type) ? GetInst() : -1;
65+
}
6066

6167
private:
6268
NT_Handle m_handle;

ntcore/src/main/native/cpp/LocalStorage.cpp

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ void LocalStorage::Impl::PropertiesUpdated(TopicData* topic,
403403
NotifyTopic(topic, eventFlags | NT_EVENT_PROPERTIES);
404404
// check local flag so we don't echo back received properties changes
405405
if (m_network && sendNetwork) {
406-
m_network->SetProperties(topic->handle, topic->name, update);
406+
m_network->SetProperties(topic->name, update);
407407
}
408408
}
409409

@@ -427,10 +427,10 @@ void LocalStorage::Impl::RefreshPubSubActive(TopicData* topic,
427427
void LocalStorage::Impl::NetworkAnnounce(TopicData* topic,
428428
std::string_view typeStr,
429429
const wpi::json& properties,
430-
NT_Publisher pubHandle) {
430+
std::optional<int> pubuid) {
431431
DEBUG4("LS NetworkAnnounce({}, {}, {}, {})", topic->name, typeStr,
432-
properties.dump(), pubHandle);
433-
if (pubHandle != 0) {
432+
properties.dump(), pubuid.value_or(-1));
433+
if (pubuid.has_value()) {
434434
return; // ack of our publish; ignore
435435
}
436436

@@ -503,7 +503,7 @@ void LocalStorage::Impl::RemoveNetworkPublisher(TopicData* topic) {
503503
// this may result in a duplicate publish warning on the server side,
504504
// but send one anyway in this case just to be sure
505505
if (nextPub->active && m_network) {
506-
m_network->Publish(nextPub->handle, topic->handle, topic->name,
506+
m_network->Publish(Handle{nextPub->handle}.GetIndex(), topic->name,
507507
topic->typeStr, topic->properties, nextPub->config);
508508
}
509509
}
@@ -561,7 +561,7 @@ LocalStorage::PublisherData* LocalStorage::Impl::AddLocalPublisher(
561561
}
562562

563563
if (publisher->active && m_network) {
564-
m_network->Publish(publisher->handle, topic->handle, topic->name,
564+
m_network->Publish(Handle{publisher->handle}.GetIndex(), topic->name,
565565
topic->typeStr, topic->properties, config);
566566
}
567567
return publisher;
@@ -580,7 +580,7 @@ LocalStorage::Impl::RemoveLocalPublisher(NT_Publisher pubHandle) {
580580
}
581581

582582
if (publisher->active && m_network) {
583-
m_network->Unpublish(publisher->handle, topic->handle);
583+
m_network->Unpublish(Handle{publisher->handle}.GetIndex());
584584
}
585585

586586
if (publisher->active && !topic->localPublishers.empty()) {
@@ -593,7 +593,7 @@ LocalStorage::Impl::RemoveLocalPublisher(NT_Publisher pubHandle) {
593593
topic->typeStr = nextPub->config.typeStr;
594594
RefreshPubSubActive(topic, false);
595595
if (nextPub->active && m_network) {
596-
m_network->Publish(nextPub->handle, topic->handle, topic->name,
596+
m_network->Publish(Handle{nextPub->handle}.GetIndex(), topic->name,
597597
topic->typeStr, topic->properties,
598598
nextPub->config);
599599
}
@@ -619,7 +619,8 @@ LocalStorage::SubscriberData* LocalStorage::Impl::AddLocalSubscriber(
619619
}
620620
if (m_network && !subscriber->config.hidden) {
621621
DEBUG4("-> NetworkSubscribe({})", topic->name);
622-
m_network->Subscribe(subscriber->handle, {{topic->name}}, config);
622+
m_network->Subscribe(Handle{subscriber->handle}.GetIndex(), {{topic->name}},
623+
config);
623624
}
624625

625626
// queue current value
@@ -647,7 +648,7 @@ LocalStorage::Impl::RemoveLocalSubscriber(NT_Subscriber subHandle) {
647648
}
648649
}
649650
if (m_network && !subscriber->config.hidden) {
650-
m_network->Unsubscribe(subscriber->handle);
651+
m_network->Unsubscribe(Handle{subscriber->handle}.GetIndex());
651652
}
652653
}
653654
return subscriber;
@@ -684,8 +685,8 @@ LocalStorage::MultiSubscriberData* LocalStorage::Impl::AddMultiSubscriber(
684685
}
685686
if (m_network && !subscriber->options.hidden) {
686687
DEBUG4("-> NetworkSubscribe");
687-
m_network->Subscribe(subscriber->handle, subscriber->prefixes,
688-
subscriber->options);
688+
m_network->Subscribe(Handle{subscriber->handle}.GetIndex(),
689+
subscriber->prefixes, subscriber->options);
689690
}
690691
return subscriber;
691692
}
@@ -703,7 +704,7 @@ LocalStorage::Impl::RemoveMultiSubscriber(NT_MultiSubscriber subHandle) {
703704
}
704705
}
705706
if (m_network && !subscriber->options.hidden) {
706-
m_network->Unsubscribe(subscriber->handle);
707+
m_network->Unsubscribe(Handle{subscriber->handle}.GetIndex());
707708
}
708709
}
709710
return subscriber;
@@ -977,7 +978,7 @@ bool LocalStorage::Impl::PublishLocalValue(PublisherData* publisher,
977978
if (publisher->topic->IsCached()) {
978979
publisher->topic->lastValueNetwork = value;
979980
}
980-
m_network->SetValue(publisher->handle, value);
981+
m_network->SetValue(Handle{publisher->handle}.GetIndex(), value);
981982
}
982983
return SetValue(publisher->topic, value, NT_EVENT_VALUE_LOCAL,
983984
suppressDuplicates, publisher);
@@ -1076,10 +1077,10 @@ LocalStorage::~LocalStorage() = default;
10761077
NT_Topic LocalStorage::NetworkAnnounce(std::string_view name,
10771078
std::string_view typeStr,
10781079
const wpi::json& properties,
1079-
NT_Publisher pubHandle) {
1080+
std::optional<int> pubuid) {
10801081
std::scoped_lock lock{m_mutex};
10811082
auto topic = m_impl.GetOrCreateTopic(name);
1082-
m_impl.NetworkAnnounce(topic, typeStr, properties, pubHandle);
1083+
m_impl.NetworkAnnounce(topic, typeStr, properties, pubuid);
10831084
return topic->handle;
10841085
}
10851086

@@ -1124,25 +1125,26 @@ void LocalStorage::Impl::StartNetwork(net::NetworkInterface* network) {
11241125
PublisherData* anyPublisher = nullptr;
11251126
for (auto&& publisher : topic->localPublishers) {
11261127
if (publisher->active) {
1127-
network->Publish(publisher->handle, topic->handle, topic->name,
1128+
network->Publish(Handle{publisher->handle}.GetIndex(), topic->name,
11281129
topic->typeStr, topic->properties, publisher->config);
11291130
anyPublisher = publisher;
11301131
}
11311132
}
11321133
if (anyPublisher && topic->lastValue) {
1133-
network->SetValue(anyPublisher->handle, topic->lastValue);
1134+
network->SetValue(Handle{anyPublisher->handle}.GetIndex(),
1135+
topic->lastValue);
11341136
}
11351137
}
11361138
for (auto&& subscriber : m_subscribers) {
11371139
if (!subscriber->config.hidden) {
1138-
network->Subscribe(subscriber->handle, {{subscriber->topic->name}},
1139-
subscriber->config);
1140+
network->Subscribe(Handle{subscriber->handle}.GetIndex(),
1141+
{{subscriber->topic->name}}, subscriber->config);
11401142
}
11411143
}
11421144
for (auto&& subscriber : m_multiSubscribers) {
11431145
if (!subscriber->options.hidden) {
1144-
network->Subscribe(subscriber->handle, subscriber->prefixes,
1145-
subscriber->options);
1146+
network->Subscribe(Handle{subscriber->handle}.GetIndex(),
1147+
subscriber->prefixes, subscriber->options);
11461148
}
11471149
}
11481150
}

ntcore/src/main/native/cpp/LocalStorage.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class LocalStorage final : public net::ILocalStorage {
4848
// network interface functions
4949
NT_Topic NetworkAnnounce(std::string_view name, std::string_view typeStr,
5050
const wpi::json& properties,
51-
NT_Publisher pubHandle) final;
51+
std::optional<int> pubuid) final;
5252
void NetworkUnannounce(std::string_view name) final;
5353
void NetworkPropertiesUpdate(std::string_view name, const wpi::json& update,
5454
bool ack) final;
@@ -601,7 +601,8 @@ class LocalStorage final : public net::ILocalStorage {
601601
void RefreshPubSubActive(TopicData* topic, bool warnOnSubMismatch);
602602

603603
void NetworkAnnounce(TopicData* topic, std::string_view typeStr,
604-
const wpi::json& properties, NT_Publisher pubHandle);
604+
const wpi::json& properties,
605+
std::optional<int> pubuid);
605606
void RemoveNetworkPublisher(TopicData* topic);
606607
void NetworkPropertiesUpdate(TopicData* topic, const wpi::json& update,
607608
bool ack);

ntcore/src/main/native/cpp/NetworkClient.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ void NetworkClient::WsConnected(wpi::WebSocket& ws, uv::Tcp& tcp,
407407
m_wire = std::make_shared<net::WebSocketConnection>(
408408
ws, connInfo.protocol_version, m_logger);
409409
m_clientImpl = std::make_unique<net::ClientImpl>(
410-
m_loop.Now().count(), m_inst, *m_wire, m_logger, m_timeSyncUpdated,
410+
m_loop.Now().count(), *m_wire, m_logger, m_timeSyncUpdated,
411411
[this](uint32_t repeatMs) {
412412
DEBUG4("Setting periodic timer to {}", repeatMs);
413413
if (m_sendOutgoingTimer &&

ntcore/src/main/native/cpp/NetworkServer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ void NetworkServer::ServerConnection4::ProcessWsUpgrade() {
254254
m_websocket->binary.connect([this](std::span<const uint8_t> data, bool) {
255255
while (!data.empty()) {
256256
// decode message
257-
int64_t pubuid;
257+
int pubuid;
258258
Value value;
259259
std::string error;
260260
if (!net::WireDecodeBinary(&data, &pubuid, &value, &error, 0)) {

ntcore/src/main/native/cpp/net/ClientImpl.cpp

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@ using namespace nt;
2828
using namespace nt::net;
2929

3030
ClientImpl::ClientImpl(
31-
uint64_t curTimeMs, int inst, WireConnection& wire, wpi::Logger& logger,
31+
uint64_t curTimeMs, WireConnection& wire, wpi::Logger& logger,
3232
std::function<void(int64_t serverTimeOffset, int64_t rtt2, bool valid)>
3333
timeSyncUpdated,
3434
std::function<void(uint32_t repeatMs)> setPeriodic)
35-
: m_inst{inst},
36-
m_wire{wire},
35+
: m_wire{wire},
3736
m_logger{logger},
3837
m_timeSyncUpdated{std::move(timeSyncUpdated)},
3938
m_setPeriodic{std::move(setPeriodic)},
@@ -58,7 +57,7 @@ void ClientImpl::ProcessIncomingBinary(uint64_t curTimeMs,
5857
}
5958

6059
// decode message
61-
int64_t id;
60+
int id;
6261
Value value;
6362
std::string error;
6463
if (!WireDecodeBinary(&data, &id, &value, &error,
@@ -114,13 +113,13 @@ void ClientImpl::HandleLocal(std::vector<ClientMessage>&& msgs) {
114113
for (auto&& elem : msgs) {
115114
// common case is value
116115
if (auto msg = std::get_if<ClientValueMsg>(&elem.contents)) {
117-
SetValue(msg->pubHandle, msg->value);
116+
SetValue(msg->pubuid, msg->value);
118117
} else if (auto msg = std::get_if<PublishMsg>(&elem.contents)) {
119-
Publish(msg->pubHandle, msg->topicHandle, msg->name, msg->typeStr,
120-
msg->properties, msg->options);
121-
m_outgoing.SendMessage(msg->pubHandle, std::move(elem));
118+
Publish(msg->pubuid, msg->name, msg->typeStr, msg->properties,
119+
msg->options);
120+
m_outgoing.SendMessage(msg->pubuid, std::move(elem));
122121
} else if (auto msg = std::get_if<UnpublishMsg>(&elem.contents)) {
123-
Unpublish(msg->pubHandle, msg->topicHandle, std::move(elem));
122+
Unpublish(msg->pubuid, std::move(elem));
124123
} else {
125124
m_outgoing.SendMessage(0, std::move(elem));
126125
}
@@ -174,38 +173,33 @@ void ClientImpl::UpdatePeriodic() {
174173
m_setPeriodic(m_periodMs);
175174
}
176175

177-
void ClientImpl::Publish(NT_Publisher pubHandle, NT_Topic topicHandle,
178-
std::string_view name, std::string_view typeStr,
179-
const wpi::json& properties,
176+
void ClientImpl::Publish(int32_t pubuid, std::string_view name,
177+
std::string_view typeStr, const wpi::json& properties,
180178
const PubSubOptionsImpl& options) {
181-
unsigned int index = Handle{pubHandle}.GetIndex();
182-
if (index >= m_publishers.size()) {
183-
m_publishers.resize(index + 1);
179+
if (static_cast<uint32_t>(pubuid) >= m_publishers.size()) {
180+
m_publishers.resize(pubuid + 1);
184181
}
185-
auto& publisher = m_publishers[index];
182+
auto& publisher = m_publishers[pubuid];
186183
if (!publisher) {
187184
publisher = std::make_unique<PublisherData>();
188185
}
189-
publisher->handle = pubHandle;
190186
publisher->options = options;
191187
publisher->periodMs = std::lround(options.periodicMs / 10.0) * 10;
192188
if (publisher->periodMs < kMinPeriodMs) {
193189
publisher->periodMs = kMinPeriodMs;
194190
}
195-
m_outgoing.SetPeriod(pubHandle, publisher->periodMs);
191+
m_outgoing.SetPeriod(pubuid, publisher->periodMs);
196192

197193
// update period
198194
m_periodMs = UpdatePeriodCalc(m_periodMs, publisher->periodMs);
199195
UpdatePeriodic();
200196
}
201197

202-
void ClientImpl::Unpublish(NT_Publisher pubHandle, NT_Topic topicHandle,
203-
ClientMessage&& msg) {
204-
unsigned int index = Handle{pubHandle}.GetIndex();
205-
if (index >= m_publishers.size()) {
198+
void ClientImpl::Unpublish(int32_t pubuid, ClientMessage&& msg) {
199+
if (static_cast<uint32_t>(pubuid) >= m_publishers.size()) {
206200
return;
207201
}
208-
m_publishers[index].reset();
202+
m_publishers[pubuid].reset();
209203

210204
// loop over all publishers to update period
211205
m_periodMs = kMaxPeriodMs;
@@ -216,40 +210,35 @@ void ClientImpl::Unpublish(NT_Publisher pubHandle, NT_Topic topicHandle,
216210
}
217211
UpdatePeriodic();
218212

219-
m_outgoing.SendMessage(pubHandle, std::move(msg));
213+
m_outgoing.SendMessage(pubuid, std::move(msg));
220214

221215
// remove from outgoing handle map
222-
m_outgoing.EraseHandle(pubHandle);
216+
m_outgoing.EraseId(pubuid);
223217
}
224218

225-
void ClientImpl::SetValue(NT_Publisher pubHandle, const Value& value) {
226-
DEBUG4("SetValue({}, time={}, server_time={})", pubHandle, value.time(),
219+
void ClientImpl::SetValue(int32_t pubuid, const Value& value) {
220+
DEBUG4("SetValue({}, time={}, server_time={})", pubuid, value.time(),
227221
value.server_time());
228-
unsigned int index = Handle{pubHandle}.GetIndex();
229-
if (index >= m_publishers.size() || !m_publishers[index]) {
222+
if (static_cast<uint32_t>(pubuid) >= m_publishers.size() ||
223+
!m_publishers[pubuid]) {
230224
return;
231225
}
232-
auto& publisher = *m_publishers[index];
226+
auto& publisher = *m_publishers[pubuid];
233227
m_outgoing.SendValue(
234-
pubHandle, value,
228+
pubuid, value,
235229
publisher.options.sendAll ? ValueSendMode::kAll : ValueSendMode::kNormal);
236230
}
237231

238-
void ClientImpl::ServerAnnounce(std::string_view name, int64_t id,
232+
void ClientImpl::ServerAnnounce(std::string_view name, int id,
239233
std::string_view typeStr,
240234
const wpi::json& properties,
241-
std::optional<int64_t> pubuid) {
235+
std::optional<int> pubuid) {
242236
DEBUG4("ServerAnnounce({}, {}, {})", name, id, typeStr);
243237
assert(m_local);
244-
NT_Publisher pubHandle{0};
245-
if (pubuid) {
246-
pubHandle = Handle(m_inst, pubuid.value(), Handle::kPublisher);
247-
}
248-
m_topicMap[id] =
249-
m_local->NetworkAnnounce(name, typeStr, properties, pubHandle);
238+
m_topicMap[id] = m_local->NetworkAnnounce(name, typeStr, properties, pubuid);
250239
}
251240

252-
void ClientImpl::ServerUnannounce(std::string_view name, int64_t id) {
241+
void ClientImpl::ServerUnannounce(std::string_view name, int id) {
253242
DEBUG4("ServerUnannounce({}, {})", name, id);
254243
assert(m_local);
255244
m_local->NetworkUnannounce(name);

0 commit comments

Comments
 (0)