Savestates/net: fix P2P socket data saving

This commit is contained in:
Eladash 2024-01-20 10:23:47 +02:00 committed by Elad.Ash
parent c509226bab
commit c7a94a80df
4 changed files with 16 additions and 12 deletions

View File

@ -20,7 +20,7 @@ lv2_socket_native::lv2_socket_native(lv2_socket_family family, lv2_socket_type t
}
lv2_socket_native::lv2_socket_native(utils::serial& ar, lv2_socket_type type)
: lv2_socket(ar, type)
: lv2_socket(stx::make_exact(ar), type)
{
#ifdef _WIN32
ar(so_reuseaddr, so_reuseport);
@ -37,7 +37,7 @@ lv2_socket_native::lv2_socket_native(utils::serial& ar, lv2_socket_type type)
void lv2_socket_native::save(utils::serial& ar)
{
static_cast<lv2_socket*>(this)->save(ar, true);
lv2_socket::save(ar, true);
#ifdef _WIN32
ar(so_reuseaddr, so_reuseport);
#else

View File

@ -12,30 +12,28 @@ lv2_socket_p2p::lv2_socket_p2p(lv2_socket_family family, lv2_socket_type type, l
}
lv2_socket_p2p::lv2_socket_p2p(utils::serial& ar, lv2_socket_type type)
: lv2_socket(ar, type)
: lv2_socket(stx::make_exact(ar), type)
{
ar(port, vport, bound_addr);
std::deque<std::pair<sys_net_sockaddr_in_p2p, std::vector<u8>>> data_dequeue{ar};
auto data_dequeue = ar.pop<std::deque<std::pair<sys_net_sockaddr_in_p2p, std::vector<u8>>>>();
for (; !data_dequeue.empty(); data_dequeue.pop_front())
{
data.push(data_dequeue.front());
data.push(std::move(data_dequeue.front()));
}
ar(data_dequeue);
}
void lv2_socket_p2p::save(utils::serial& ar)
{
static_cast<lv2_socket*>(this)->save(ar, true);
lv2_socket::save(ar, true);
ar(port, vport, bound_addr);
std::deque<std::pair<sys_net_sockaddr_in_p2p, std::vector<u8>>> data_dequeue;
for (; !data.empty(); data.pop())
for (auto save_data = ::as_rvalue(data); !save_data.empty(); save_data.pop())
{
data_dequeue.push_back(data.front());
data_dequeue.push_back(std::move(save_data.front()));
}
ar(data_dequeue);

View File

@ -10,13 +10,13 @@ lv2_socket_raw::lv2_socket_raw(lv2_socket_family family, lv2_socket_type type, l
}
lv2_socket_raw::lv2_socket_raw(utils::serial& ar, lv2_socket_type type)
: lv2_socket(ar, type)
: lv2_socket(stx::make_exact(ar), type)
{
}
void lv2_socket_raw::save(utils::serial& ar)
{
static_cast<lv2_socket*>(this)->save(ar, true);
lv2_socket::save(ar, true);
}
std::tuple<bool, s32, std::shared_ptr<lv2_socket>, sys_net_sockaddr> lv2_socket_raw::accept([[maybe_unused]] bool is_lock)

View File

@ -1203,6 +1203,12 @@ namespace stx
template <typename U> requires (std::is_same_v<U, T> && std::is_copy_constructible_v<T>)
operator U() const noexcept { return obj; };
};
template <typename T>
stx::exact_t<T&> make_exact(T&& obj) noexcept
{
return stx::exact_t<T&>(static_cast<T&>(obj));
}
}
// Read object of type T from raw pointer, array, string, vector, or any contiguous container