diff --git a/CMakeLists.txt b/CMakeLists.txt index ffbe44b..ca80a0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,8 @@ add_library(solanaceae_sha1_ngcft1 ./solanaceae/ngc_ft1_sha1/hash_utils.hpp ./solanaceae/ngc_ft1_sha1/hash_utils.cpp + ./solanaceae/ngc_ft1_sha1/util.hpp + ./solanaceae/ngc_ft1_sha1/ft1_sha1_info.hpp ./solanaceae/ngc_ft1_sha1/ft1_sha1_info.cpp diff --git a/solanaceae/ngc_ft1_sha1/receiving_transfers.cpp b/solanaceae/ngc_ft1_sha1/receiving_transfers.cpp index 6ab4831..f7b6f61 100644 --- a/solanaceae/ngc_ft1_sha1/receiving_transfers.cpp +++ b/solanaceae/ngc_ft1_sha1/receiving_transfers.cpp @@ -27,22 +27,22 @@ void ReceivingTransfers::tick(float delta) { } } -ReceivingTransfers::Entry& ReceivingTransfers::emplaceInfo(uint64_t combined_id, uint8_t transfer_id, const Entry::Info& info) { - auto& ent = _data[combined_id][transfer_id]; +ReceivingTransfers::Entry& ReceivingTransfers::emplaceInfo(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, const Entry::Info& info) { + auto& ent = _data[combine_ids(group_number, peer_number)][transfer_id]; ent.v = info; return ent; } -ReceivingTransfers::Entry& ReceivingTransfers::emplaceChunk(uint64_t combined_id, uint8_t transfer_id, const Entry::Chunk& chunk) { +ReceivingTransfers::Entry& ReceivingTransfers::emplaceChunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, const Entry::Chunk& chunk) { assert(!chunk.chunk_indices.empty()); - assert(!containsPeerChunk(combined_id, chunk.content, chunk.chunk_indices.front())); - auto& ent = _data[combined_id][transfer_id]; + assert(!containsPeerChunk(group_number, peer_number, chunk.content, chunk.chunk_indices.front())); + auto& ent = _data[combine_ids(group_number, peer_number)][transfer_id]; ent.v = chunk; return ent; } -bool ReceivingTransfers::containsPeerTransfer(uint64_t combined_id, uint8_t transfer_id) const { - auto it = _data.find(combined_id); +bool ReceivingTransfers::containsPeerTransfer(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id) const { + auto it = _data.find(combine_ids(group_number, peer_number)); if (it == _data.end()) { return false; } @@ -73,8 +73,8 @@ bool ReceivingTransfers::containsChunk(ObjectHandle o, size_t chunk_idx) const { return false; } -bool ReceivingTransfers::containsPeerChunk(uint64_t combined_id, ObjectHandle o, size_t chunk_idx) const { - auto it = _data.find(combined_id); +bool ReceivingTransfers::containsPeerChunk(uint32_t group_number, uint32_t peer_number, ObjectHandle o, size_t chunk_idx) const { + auto it = _data.find(combine_ids(group_number, peer_number)); if (it == _data.end()) { return false; } @@ -99,12 +99,12 @@ bool ReceivingTransfers::containsPeerChunk(uint64_t combined_id, ObjectHandle o, return false; } -void ReceivingTransfers::removePeer(uint64_t combined_id) { - _data.erase(combined_id); +void ReceivingTransfers::removePeer(uint32_t group_number, uint32_t peer_number) { + _data.erase(combine_ids(group_number, peer_number)); } -void ReceivingTransfers::removePeerTransfer(uint64_t combined_id, uint8_t transfer_id) { - auto it = _data.find(combined_id); +void ReceivingTransfers::removePeerTransfer(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id) { + auto it = _data.find(combine_ids(group_number, peer_number)); if (it == _data.end()) { return; } @@ -120,8 +120,8 @@ size_t ReceivingTransfers::size(void) const { return count; } -size_t ReceivingTransfers::sizePeer(uint64_t combined_id) const { - auto it = _data.find(combined_id); +size_t ReceivingTransfers::sizePeer(uint32_t group_number, uint32_t peer_number) const { + auto it = _data.find(combine_ids(group_number, peer_number)); if (it == _data.end()) { return 0; } diff --git a/solanaceae/ngc_ft1_sha1/receiving_transfers.hpp b/solanaceae/ngc_ft1_sha1/receiving_transfers.hpp index bd7504f..dfc8772 100644 --- a/solanaceae/ngc_ft1_sha1/receiving_transfers.hpp +++ b/solanaceae/ngc_ft1_sha1/receiving_transfers.hpp @@ -4,6 +4,8 @@ #include +#include "./util.hpp" + #include #include #include @@ -44,21 +46,21 @@ struct ReceivingTransfers { void tick(float delta); - Entry& emplaceInfo(uint64_t combined_id, uint8_t transfer_id, const Entry::Info& info); - Entry& emplaceChunk(uint64_t combined_id, uint8_t transfer_id, const Entry::Chunk& chunk); + Entry& emplaceInfo(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, const Entry::Info& info); + Entry& emplaceChunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, const Entry::Chunk& chunk); - bool containsPeer(uint64_t combined_id) const { return _data.count(combined_id); } - bool containsPeerTransfer(uint64_t combined_id, uint8_t transfer_id) const; + bool containsPeer(uint32_t group_number, uint32_t peer_number) const { return _data.count(combine_ids(group_number, peer_number)); } + bool containsPeerTransfer(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id) const; bool containsChunk(ObjectHandle o, size_t chunk_idx) const; - bool containsPeerChunk(uint64_t combined_id, ObjectHandle o, size_t chunk_idx) const; + bool containsPeerChunk(uint32_t group_number, uint32_t peer_number, ObjectHandle o, size_t chunk_idx) const; - auto& getPeer(uint64_t combined_id) { return _data.at(combined_id); } - auto& getTransfer(uint64_t combined_id, uint8_t transfer_id) { return getPeer(combined_id).at(transfer_id); } + auto& getPeer(uint32_t group_number, uint32_t peer_number) { return _data.at(combine_ids(group_number, peer_number)); } + auto& getTransfer(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id) { return getPeer(group_number, peer_number).at(transfer_id); } - void removePeer(uint64_t combined_id); - void removePeerTransfer(uint64_t combined_id, uint8_t transfer_id); + void removePeer(uint32_t group_number, uint32_t peer_number); + void removePeerTransfer(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id); size_t size(void) const; - size_t sizePeer(uint64_t combined_id) const; + size_t sizePeer(uint32_t group_number, uint32_t peer_number) const; }; diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp index f8b7dd6..c7fbe3a 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp @@ -7,6 +7,8 @@ #include #include +#include "./util.hpp" + #include "./ft1_sha1_info.hpp" #include "./hash_utils.hpp" @@ -53,8 +55,8 @@ void SHA1_NGCFT1::queueUpRequestChunk(uint32_t group_number, uint32_t peer_numbe } // check for running transfer - if (_sending_transfers.count(combineIds(group_number, peer_number))) { - for (const auto& [_, transfer] : _sending_transfers.at(combineIds(group_number, peer_number))) { + if (_sending_transfers.count(combine_ids(group_number, peer_number))) { + for (const auto& [_, transfer] : _sending_transfers.at(combine_ids(group_number, peer_number))) { if (std::holds_alternative(transfer.v)) { // ignore info continue; @@ -82,10 +84,6 @@ void SHA1_NGCFT1::queueUpRequestChunk(uint32_t group_number, uint32_t peer_numbe _queue_requested_chunk.push_back(std::make_tuple(group_number, peer_number, content, hash, 0.f)); } -uint64_t SHA1_NGCFT1::combineIds(const uint32_t group_number, const uint32_t peer_number) { - return (uint64_t(group_number) << 32) | peer_number; -} - void SHA1_NGCFT1::updateMessages(ObjectHandle ce) { assert(ce.all_of()); @@ -322,8 +320,8 @@ void SHA1_NGCFT1::iterate(float delta) { // check if already sending bool already_sending_to_this_peer = false; - if (_sending_transfers.count(combineIds(group_number, peer_number))) { - for (const auto& [_2, t] : _sending_transfers.at(combineIds(group_number, peer_number))) { + if (_sending_transfers.count(combine_ids(group_number, peer_number))) { + for (const auto& [_2, t] : _sending_transfers.at(combine_ids(group_number, peer_number))) { if (std::holds_alternative(t.v)) { const auto& v = std::get(t.v); if (v.content == ce && v.chunk_index == chunk_idx_vec.front()) { @@ -347,7 +345,7 @@ void SHA1_NGCFT1::iterate(float delta) { &transfer_id )) { _sending_transfers - [combineIds(group_number, peer_number)] + [combine_ids(group_number, peer_number)] [transfer_id] // TODO: also save index? .v = SendingTransfer::Chunk{ce, chunk_idx_vec.front()}; } @@ -631,7 +629,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_request& e) { ); _sending_transfers - [combineIds(e.group_number, e.peer_number)] + [combine_ids(e.group_number, e.peer_number)] [transfer_id] .v = SendingTransfer::Info{content.get().data}; } else if (e.file_kind == NGCFT1_file_kind::HASH_SHA1_CHUNK) { @@ -699,7 +697,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_init& e) { } _receiving_transfers.emplaceInfo( - combineIds(e.group_number, e.peer_number), + e.group_number, e.peer_number, e.transfer_id, {ce, std::vector(e.file_size)} ); @@ -743,7 +741,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_init& e) { assert(e.file_size == info.chunkSize(idx_vec.front())); _receiving_transfers.emplaceChunk( - combineIds(e.group_number, e.peer_number), + e.group_number, e.peer_number, e.transfer_id, ReceivingTransfers::Entry::Chunk{ce, idx_vec} ); @@ -759,11 +757,11 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_init& e) { } bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_data& e) { - if (!_receiving_transfers.containsPeerTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id)) { + if (!_receiving_transfers.containsPeerTransfer(e.group_number, e.peer_number, e.transfer_id)) { return false; } - auto& transfer = _receiving_transfers.getTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id); + auto& transfer = _receiving_transfers.getTransfer(e.group_number, e.peer_number, e.transfer_id); transfer.time_since_activity = 0.f; if (transfer.isInfo()) { @@ -794,11 +792,11 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_data& e) { } bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_send_data& e) { - if (!_sending_transfers.count(combineIds(e.group_number, e.peer_number))) { + if (!_sending_transfers.count(combine_ids(e.group_number, e.peer_number))) { return false; } - auto& peer = _sending_transfers.at(combineIds(e.group_number, e.peer_number)); + auto& peer = _sending_transfers.at(combine_ids(e.group_number, e.peer_number)); if (!peer.count(e.transfer_id)) { return false; @@ -846,11 +844,11 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_send_data& e) { } bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) { - if (!_receiving_transfers.containsPeerTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id)) { + if (!_receiving_transfers.containsPeerTransfer(e.group_number, e.peer_number, e.transfer_id)) { return false; } - auto& transfer = _receiving_transfers.getTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id); + auto& transfer = _receiving_transfers.getTransfer(e.group_number, e.peer_number, e.transfer_id); if (transfer.isInfo()) { auto& info = transfer.getInfo(); @@ -858,7 +856,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) { if (o.any_of()) { // we already have the info, discard - _receiving_transfers.removePeerTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id); + _receiving_transfers.removePeerTransfer(e.group_number, e.peer_number, e.transfer_id); return true; } @@ -869,7 +867,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) { if (o.get().hash != hash) { std::cerr << "SHA1_NGCFT1 error: got info data mismatching its hash\n"; // TODO: requeue info request; eg manipulate o.get(); - _receiving_transfers.removePeerTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id); + _receiving_transfers.removePeerTransfer(e.group_number, e.peer_number, e.transfer_id); return true; } @@ -997,17 +995,17 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) { updateMessages(o); // mostly for received bytes } - _receiving_transfers.removePeerTransfer(combineIds(e.group_number, e.peer_number), e.transfer_id); + _receiving_transfers.removePeerTransfer(e.group_number, e.peer_number, e.transfer_id); return true; } bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_send_done& e) { - if (!_sending_transfers.count(combineIds(e.group_number, e.peer_number))) { + if (!_sending_transfers.count(combine_ids(e.group_number, e.peer_number))) { return false; } - auto& peer_transfers = _sending_transfers.at(combineIds(e.group_number, e.peer_number)); + auto& peer_transfers = _sending_transfers.at(combine_ids(e.group_number, e.peer_number)); if (!peer_transfers.count(e.transfer_id)) { return false; } diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp index 217cee6..22bb203 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp @@ -80,8 +80,6 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public using InfoBuilderEntry = std::function; std::list _info_builder_queue; - static uint64_t combineIds(const uint32_t group_number, const uint32_t peer_number); - void updateMessages(ObjectHandle ce); std::optional> selectPeerForRequest(ObjectHandle ce); diff --git a/solanaceae/ngc_ft1_sha1/util.hpp b/solanaceae/ngc_ft1_sha1/util.hpp new file mode 100644 index 0000000..9405b14 --- /dev/null +++ b/solanaceae/ngc_ft1_sha1/util.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +inline static uint64_t combine_ids(const uint32_t group_number, const uint32_t peer_number) { + return (uint64_t(group_number) << 32) | peer_number; +} + +inline static void decompose_ids(const uint64_t combined_id, uint32_t& group_number, uint32_t& peer_number) { + group_number = combined_id >> 32; + peer_number = combined_id & 0xffffffff; +} +