mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 13:31:27 +12:00
Savestates/net: fix P2P socket data saving
This commit is contained in:
parent
c509226bab
commit
c7a94a80df
4 changed files with 16 additions and 12 deletions
|
@ -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_native::lv2_socket_native(utils::serial& ar, lv2_socket_type type)
|
||||||
: lv2_socket(ar, type)
|
: lv2_socket(stx::make_exact(ar), type)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ar(so_reuseaddr, so_reuseport);
|
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)
|
void lv2_socket_native::save(utils::serial& ar)
|
||||||
{
|
{
|
||||||
static_cast<lv2_socket*>(this)->save(ar, true);
|
lv2_socket::save(ar, true);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ar(so_reuseaddr, so_reuseport);
|
ar(so_reuseaddr, so_reuseport);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -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_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);
|
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())
|
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)
|
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);
|
ar(port, vport, bound_addr);
|
||||||
|
|
||||||
std::deque<std::pair<sys_net_sockaddr_in_p2p, std::vector<u8>>> data_dequeue;
|
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);
|
ar(data_dequeue);
|
||||||
|
|
|
@ -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_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)
|
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)
|
std::tuple<bool, s32, std::shared_ptr<lv2_socket>, sys_net_sockaddr> lv2_socket_raw::accept([[maybe_unused]] bool is_lock)
|
||||||
|
|
|
@ -1203,6 +1203,12 @@ namespace stx
|
||||||
template <typename U> requires (std::is_same_v<U, T> && std::is_copy_constructible_v<T>)
|
template <typename U> requires (std::is_same_v<U, T> && std::is_copy_constructible_v<T>)
|
||||||
operator U() const noexcept { return obj; };
|
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
|
// Read object of type T from raw pointer, array, string, vector, or any contiguous container
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue