mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-05 14:37:08 +00:00
replace bs_t with rx::EnumBitSet
This commit is contained in:
parent
3f14b99f24
commit
2965aaf3e3
46 changed files with 600 additions and 809 deletions
|
|
@ -124,7 +124,7 @@ enum class lv2_mp_flag {
|
|||
strict_get_block_size,
|
||||
cache,
|
||||
|
||||
__bitset_enum_max
|
||||
bitset_last = cache,
|
||||
};
|
||||
|
||||
enum class lv2_file_type {
|
||||
|
|
@ -140,7 +140,7 @@ struct lv2_fs_mount_point {
|
|||
const u32 sector_size = 512;
|
||||
const u64 sector_count = 256;
|
||||
const u32 block_size = 4096;
|
||||
const bs_t<lv2_mp_flag> flags{};
|
||||
const rx::EnumBitSet<lv2_mp_flag> flags{};
|
||||
lv2_fs_mount_point *const next = nullptr;
|
||||
|
||||
mutable shared_mutex mutex;
|
||||
|
|
|
|||
|
|
@ -1,16 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include "util/bit_set.h"
|
||||
#include "util/mutex.h"
|
||||
|
||||
#include "Emu/Cell/ErrorCodes.h"
|
||||
#include "Emu/Memory/vm_ptr.h"
|
||||
|
||||
#include <functional>
|
||||
#include <queue>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
// Error codes
|
||||
enum sys_net_error : s32 {
|
||||
SYS_NET_ENOENT = 2,
|
||||
|
|
@ -54,7 +46,7 @@ enum sys_net_error : s32 {
|
|||
};
|
||||
|
||||
static constexpr sys_net_error operator-(sys_net_error v) {
|
||||
return sys_net_error{-+v};
|
||||
return sys_net_error{-static_cast<s32>(v)};
|
||||
}
|
||||
|
||||
// Socket types (prefixed with SYS_NET_)
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
#include "Emu/IdManager.h"
|
||||
#include "Emu/NP/ip_address.h"
|
||||
#include "cellos/sys_net.h"
|
||||
#include "rx/EnumBitSet.hpp"
|
||||
#include "util/atomic_bit_set.h"
|
||||
#include "util/mutex.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
@ -32,7 +34,7 @@ public:
|
|||
write,
|
||||
error,
|
||||
|
||||
__bitset_enum_max
|
||||
bitset_last
|
||||
};
|
||||
|
||||
union sockopt_data {
|
||||
|
|
@ -62,10 +64,10 @@ public:
|
|||
std::unique_lock<shared_mutex> lock();
|
||||
|
||||
void set_lv2_id(u32 id);
|
||||
bs_t<poll_t> get_events() const;
|
||||
void set_poll_event(bs_t<poll_t> event);
|
||||
void poll_queue(shared_ptr<ppu_thread> ppu, bs_t<poll_t> event,
|
||||
std::function<bool(bs_t<poll_t>)> poll_cb);
|
||||
rx::EnumBitSet<poll_t> get_events() const;
|
||||
void set_poll_event(rx::EnumBitSet<poll_t> event);
|
||||
void poll_queue(shared_ptr<ppu_thread> ppu, rx::EnumBitSet<poll_t> event,
|
||||
std::function<bool(rx::EnumBitSet<poll_t>)> poll_cb);
|
||||
u32 clear_queue(ppu_thread *);
|
||||
void handle_events(const pollfd &native_fd, bool unset_connecting = false);
|
||||
void queue_wake(ppu_thread *ppu);
|
||||
|
|
@ -110,7 +112,7 @@ public:
|
|||
virtual s32 shutdown(s32 how) = 0;
|
||||
|
||||
virtual s32 poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) = 0;
|
||||
virtual std::tuple<bool, bool, bool> select(bs_t<poll_t> selected,
|
||||
virtual std::tuple<bool, bool, bool> select(rx::EnumBitSet<poll_t> selected,
|
||||
pollfd &native_pfd) = 0;
|
||||
|
||||
error_code abort_socket(s32 flags);
|
||||
|
|
@ -137,8 +139,8 @@ protected:
|
|||
atomic_bs_t<poll_t> events{};
|
||||
|
||||
// Event processing workload (pair of thread id and the processing function)
|
||||
std::vector<
|
||||
std::pair<shared_ptr<ppu_thread>, std::function<bool(bs_t<poll_t>)>>>
|
||||
std::vector<std::pair<shared_ptr<ppu_thread>,
|
||||
std::function<bool(rx::EnumBitSet<poll_t>)>>>
|
||||
queue;
|
||||
|
||||
// Socket options value keepers
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ public:
|
|||
bool is_lock = true) override;
|
||||
|
||||
s32 poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) override;
|
||||
std::tuple<bool, bool, bool> select(bs_t<poll_t> selected,
|
||||
std::tuple<bool, bool, bool> select(rx::EnumBitSet<poll_t> selected,
|
||||
pollfd &native_pfd) override;
|
||||
|
||||
bool is_socket_connected();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "lv2_socket.h"
|
||||
#include <queue>
|
||||
|
||||
class lv2_socket_p2p : public lv2_socket {
|
||||
public:
|
||||
|
|
@ -38,7 +39,7 @@ public:
|
|||
s32 shutdown(s32 how) override;
|
||||
|
||||
s32 poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) override;
|
||||
std::tuple<bool, bool, bool> select(bs_t<poll_t> selected,
|
||||
std::tuple<bool, bool, bool> select(rx::EnumBitSet<poll_t> selected,
|
||||
pollfd &native_pfd) override;
|
||||
|
||||
void handle_new_data(sys_net_sockaddr_in_p2p p2p_addr,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <deque>
|
||||
#ifdef _WIN32
|
||||
#include <WS2tcpip.h>
|
||||
#include <winsock2.h>
|
||||
|
|
@ -101,7 +102,7 @@ public:
|
|||
s32 shutdown(s32 how) override;
|
||||
|
||||
s32 poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) override;
|
||||
std::tuple<bool, bool, bool> select(bs_t<poll_t> selected,
|
||||
std::tuple<bool, bool, bool> select(rx::EnumBitSet<poll_t> selected,
|
||||
pollfd &native_pfd) override;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -40,6 +40,6 @@ public:
|
|||
s32 shutdown(s32 how) override;
|
||||
|
||||
s32 poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) override;
|
||||
std::tuple<bool, bool, bool> select(bs_t<poll_t> selected,
|
||||
std::tuple<bool, bool, bool> select(rx::EnumBitSet<poll_t> selected,
|
||||
pollfd &native_pfd) override;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#include "sys_usbd.h"
|
||||
#include "sys_vm.h"
|
||||
|
||||
#include "util/atomic_bit_set.h"
|
||||
#include "util/init_mutex.hpp"
|
||||
#include "util/sysinfo.hpp"
|
||||
#include "util/tsc.hpp"
|
||||
|
|
@ -1762,17 +1763,18 @@ bool lv2_obj::sleep_unlocked(cpu_thread &thread, u64 timeout,
|
|||
return_val = false;
|
||||
}
|
||||
|
||||
const auto [_, ok] = ppu->state.fetch_op([&](bs_t<cpu_flag> &val) {
|
||||
if (!(val & cpu_flag::signal)) {
|
||||
val += cpu_flag::suspend;
|
||||
const auto [_, ok] =
|
||||
ppu->state.fetch_op([&](rx::EnumBitSet<cpu_flag> &val) {
|
||||
if (!(val & cpu_flag::signal)) {
|
||||
val += cpu_flag::suspend;
|
||||
|
||||
// Flag used for forced timeout notification
|
||||
ensure(!timeout || !(val & cpu_flag::notify));
|
||||
return true;
|
||||
}
|
||||
// Flag used for forced timeout notification
|
||||
ensure(!timeout || !(val & cpu_flag::notify));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
if (!ok) {
|
||||
ppu_log.fatal("sleep() failed (signaled) (%s)", ppu->current_function);
|
||||
|
|
@ -2075,7 +2077,7 @@ void lv2_obj::schedule_all(u64 current_time) {
|
|||
ppu_log.trace("schedule(): %s", target->id);
|
||||
|
||||
// Remove yield if it was sleeping until now
|
||||
const bs_t<cpu_flag> remove_yield =
|
||||
const rx::EnumBitSet<cpu_flag> remove_yield =
|
||||
target->start_time == 0 ? +cpu_flag::suspend
|
||||
: (cpu_flag::yield + cpu_flag::preempt);
|
||||
|
||||
|
|
|
|||
|
|
@ -740,7 +740,7 @@ lv2_file::open_raw_result_t lv2_file::open_raw(const std::string &local_path,
|
|||
return {CELL_EISDIR};
|
||||
}
|
||||
|
||||
bs_t<fs::open_mode> open_mode{};
|
||||
rx::EnumBitSet<fs::open_mode> open_mode{};
|
||||
|
||||
switch (flags & CELL_FS_O_ACCMODE) {
|
||||
case CELL_FS_O_RDONLY:
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ error_code sys_net_bnet_accept(ppu_thread &ppu, s32 s,
|
|||
|
||||
sock.poll_queue(idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
lv2_socket::poll_t::read,
|
||||
[&](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[&](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::read) {
|
||||
auto [success, res, res_socket, res_addr] =
|
||||
sock.accept(false);
|
||||
|
|
@ -554,7 +554,7 @@ error_code sys_net_bnet_connect(ppu_thread &ppu, s32 s,
|
|||
|
||||
sock.poll_queue(idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
lv2_socket::poll_t::write,
|
||||
[&](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[&](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::write) {
|
||||
result = sock.connect_followup();
|
||||
|
||||
|
|
@ -819,7 +819,7 @@ error_code sys_net_bnet_recvfrom(ppu_thread &ppu, s32 s, vm::ptr<void> buf,
|
|||
sock.poll_queue(
|
||||
idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
lv2_socket::poll_t::read,
|
||||
[&](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[&](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::read) {
|
||||
const auto success = sock.recvfrom(flags, len, false);
|
||||
|
||||
|
|
@ -929,7 +929,7 @@ error_code sys_net_bnet_sendmsg(ppu_thread &ppu, s32 s,
|
|||
|
||||
sock.poll_queue(idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
lv2_socket::poll_t::write,
|
||||
[&](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[&](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::write) {
|
||||
const auto success =
|
||||
sock.sendmsg(flags, *netmsg, false);
|
||||
|
|
@ -1023,7 +1023,7 @@ error_code sys_net_bnet_sendto(ppu_thread &ppu, s32 s, vm::cptr<void> buf,
|
|||
// Enable write event
|
||||
sock.poll_queue(idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
lv2_socket::poll_t::write,
|
||||
[&](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[&](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::write) {
|
||||
auto success =
|
||||
sock.sendto(flags, buf_copy, sn_addr, false);
|
||||
|
|
@ -1336,7 +1336,7 @@ error_code sys_net_bnet_poll(ppu_thread &ppu, vm::ptr<sys_net_pollfd> fds,
|
|||
sock->set_connecting(connecting[i]);
|
||||
#endif
|
||||
|
||||
bs_t<lv2_socket::poll_t> selected = +lv2_socket::poll_t::error;
|
||||
rx::EnumBitSet<lv2_socket::poll_t> selected = +lv2_socket::poll_t::error;
|
||||
|
||||
if (fds_buf[i].events & SYS_NET_POLLIN)
|
||||
selected += lv2_socket::poll_t::read;
|
||||
|
|
@ -1348,7 +1348,7 @@ error_code sys_net_bnet_poll(ppu_thread &ppu, vm::ptr<sys_net_pollfd> fds,
|
|||
sock->poll_queue(idm::get_unlocked<named_thread<ppu_thread>>(ppu.id),
|
||||
selected,
|
||||
[sock, selected, &fds_buf, i, &signaled,
|
||||
&ppu](bs_t<lv2_socket::poll_t> events) {
|
||||
&ppu](rx::EnumBitSet<lv2_socket::poll_t> events) {
|
||||
if (events & selected) {
|
||||
if (events & selected & lv2_socket::poll_t::read)
|
||||
fds_buf[i].revents |= SYS_NET_POLLIN;
|
||||
|
|
@ -1457,7 +1457,7 @@ error_code sys_net_bnet_select(ppu_thread &ppu, s32 nfds,
|
|||
|
||||
for (s32 i = 0; i < nfds; i++) {
|
||||
_fds[i].fd = -1;
|
||||
bs_t<lv2_socket::poll_t> selected{};
|
||||
rx::EnumBitSet<lv2_socket::poll_t> selected{};
|
||||
|
||||
if (readfds && _readfds.bit(i))
|
||||
selected += lv2_socket::poll_t::read;
|
||||
|
|
@ -1529,7 +1529,7 @@ error_code sys_net_bnet_select(ppu_thread &ppu, s32 nfds,
|
|||
}
|
||||
|
||||
for (s32 i = 0; i < nfds; i++) {
|
||||
bs_t<lv2_socket::poll_t> selected{};
|
||||
rx::EnumBitSet<lv2_socket::poll_t> selected{};
|
||||
|
||||
if (readfds && _readfds.bit(i))
|
||||
selected += lv2_socket::poll_t::read;
|
||||
|
|
@ -1554,7 +1554,7 @@ error_code sys_net_bnet_select(ppu_thread &ppu, s32 nfds,
|
|||
sock->poll_queue(
|
||||
idm::get_unlocked<named_thread<ppu_thread>>(ppu.id), selected,
|
||||
[sock, selected, i, &rread, &rwrite, &rexcept, &signaled,
|
||||
&ppu](bs_t<lv2_socket::poll_t> events) {
|
||||
&ppu](rx::EnumBitSet<lv2_socket::poll_t> events) {
|
||||
if (events & selected) {
|
||||
if (selected & lv2_socket::poll_t::read &&
|
||||
events &
|
||||
|
|
|
|||
|
|
@ -32,17 +32,17 @@ void lv2_socket::set_connecting(bool connecting) {
|
|||
|
||||
void lv2_socket::set_lv2_id(u32 id) { lv2_id = id; }
|
||||
|
||||
bs_t<lv2_socket::poll_t> lv2_socket::get_events() const {
|
||||
rx::EnumBitSet<lv2_socket::poll_t> lv2_socket::get_events() const {
|
||||
return events.load();
|
||||
}
|
||||
|
||||
void lv2_socket::set_poll_event(bs_t<lv2_socket::poll_t> event) {
|
||||
void lv2_socket::set_poll_event(rx::EnumBitSet<lv2_socket::poll_t> event) {
|
||||
events += event;
|
||||
}
|
||||
|
||||
void lv2_socket::poll_queue(
|
||||
shared_ptr<ppu_thread> ppu, bs_t<lv2_socket::poll_t> event,
|
||||
std::function<bool(bs_t<lv2_socket::poll_t>)> poll_cb) {
|
||||
shared_ptr<ppu_thread> ppu, rx::EnumBitSet<lv2_socket::poll_t> event,
|
||||
std::function<bool(rx::EnumBitSet<lv2_socket::poll_t>)> poll_cb) {
|
||||
set_poll_event(event);
|
||||
queue.emplace_back(std::move(ppu), poll_cb);
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ u32 lv2_socket::clear_queue(ppu_thread *ppu) {
|
|||
|
||||
void lv2_socket::handle_events(const pollfd &native_pfd,
|
||||
[[maybe_unused]] bool unset_connecting) {
|
||||
bs_t<lv2_socket::poll_t> events_happening{};
|
||||
rx::EnumBitSet<lv2_socket::poll_t> events_happening{};
|
||||
|
||||
if (native_pfd.revents & (POLLIN | POLLHUP) &&
|
||||
events.test_and_reset(lv2_socket::poll_t::read))
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ std::optional<s32> lv2_socket_native::connect(const sys_net_sockaddr &addr) {
|
|||
#endif
|
||||
this->poll_queue(
|
||||
null_ptr, lv2_socket::poll_t::write,
|
||||
[this](bs_t<lv2_socket::poll_t> events) -> bool {
|
||||
[this](rx::EnumBitSet<lv2_socket::poll_t> events) -> bool {
|
||||
if (events & lv2_socket::poll_t::write) {
|
||||
int native_error;
|
||||
::socklen_t size = sizeof(native_error);
|
||||
|
|
@ -1101,7 +1101,7 @@ s32 lv2_socket_native::poll(sys_net_pollfd &sn_pfd, pollfd &native_pfd) {
|
|||
}
|
||||
|
||||
std::tuple<bool, bool, bool>
|
||||
lv2_socket_native::select(bs_t<lv2_socket::poll_t> selected,
|
||||
lv2_socket_native::select(rx::EnumBitSet<lv2_socket::poll_t> selected,
|
||||
pollfd &native_pfd) {
|
||||
native_pfd.fd = native_socket;
|
||||
if (selected & lv2_socket::poll_t::read) {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include "sys_net/lv2_socket_p2p.h"
|
||||
#include "sys_net/network_context.h"
|
||||
#include "sys_net/sys_net_helpers.h"
|
||||
#include <deque>
|
||||
|
||||
LOG_CHANNEL(sys_net);
|
||||
|
||||
|
|
@ -54,7 +55,7 @@ void lv2_socket_p2p::handle_new_data(sys_net_sockaddr_in_p2p p2p_addr,
|
|||
|
||||
// Check if poll is happening
|
||||
if (events.test_and_reset(lv2_socket::poll_t::read)) {
|
||||
bs_t<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
rx::EnumBitSet<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
for (auto it = queue.begin(); it != queue.end();) {
|
||||
if (it->second(read_event)) {
|
||||
it = queue.erase(it);
|
||||
|
|
@ -378,7 +379,7 @@ s32 lv2_socket_p2p::poll(sys_net_pollfd &sn_pfd,
|
|||
}
|
||||
|
||||
std::tuple<bool, bool, bool>
|
||||
lv2_socket_p2p::select(bs_t<lv2_socket::poll_t> selected,
|
||||
lv2_socket_p2p::select(rx::EnumBitSet<lv2_socket::poll_t> selected,
|
||||
[[maybe_unused]] pollfd &native_pfd) {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -332,7 +332,7 @@ bool lv2_socket_p2ps::handle_connected(p2ps_encapsulated_tcp *tcp_header,
|
|||
|
||||
// check if polling is happening
|
||||
if (data_available && events.test_and_reset(lv2_socket::poll_t::read)) {
|
||||
bs_t<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
rx::EnumBitSet<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
for (auto it = queue.begin(); it != queue.end();) {
|
||||
if (it->second(read_event)) {
|
||||
it = queue.erase(it);
|
||||
|
|
@ -479,7 +479,7 @@ bool lv2_socket_p2ps::handle_listening(p2ps_encapsulated_tcp *tcp_header,
|
|||
|
||||
backlog.push_back(new_sock_id);
|
||||
if (events.test_and_reset(lv2_socket::poll_t::read)) {
|
||||
bs_t<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
rx::EnumBitSet<lv2_socket::poll_t> read_event = lv2_socket::poll_t::read;
|
||||
for (auto it = queue.begin(); it != queue.end();) {
|
||||
if (it->second(read_event)) {
|
||||
it = queue.erase(it);
|
||||
|
|
@ -983,7 +983,7 @@ s32 lv2_socket_p2ps::poll(sys_net_pollfd &sn_pfd,
|
|||
}
|
||||
|
||||
std::tuple<bool, bool, bool>
|
||||
lv2_socket_p2ps::select(bs_t<lv2_socket::poll_t> selected,
|
||||
lv2_socket_p2ps::select(rx::EnumBitSet<lv2_socket::poll_t> selected,
|
||||
[[maybe_unused]] pollfd &native_pfd) {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ s32 lv2_socket_raw::poll([[maybe_unused]] sys_net_pollfd &sn_pfd,
|
|||
}
|
||||
|
||||
std::tuple<bool, bool, bool>
|
||||
lv2_socket_raw::select([[maybe_unused]] bs_t<lv2_socket::poll_t> selected,
|
||||
lv2_socket_raw::select([[maybe_unused]] rx::EnumBitSet<lv2_socket::poll_t> selected,
|
||||
[[maybe_unused]] pollfd &native_pfd) {
|
||||
LOG_ONCE(raw_select, "lv2_socket_raw::select");
|
||||
return {};
|
||||
|
|
|
|||
|
|
@ -1295,7 +1295,7 @@ error_code sys_spu_thread_group_terminate(ppu_thread &ppu, u32 id, s32 value) {
|
|||
|
||||
for (auto &thread : group->threads) {
|
||||
if (thread) {
|
||||
thread->state.fetch_op([](bs_t<cpu_flag> &flags) {
|
||||
thread->state.fetch_op([](rx::EnumBitSet<cpu_flag> &flags) {
|
||||
if (flags & cpu_flag::stop) {
|
||||
// In case the thread raised the ret flag itself at some point do not
|
||||
// raise it again
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue