replace bs_t with rx::EnumBitSet

This commit is contained in:
DH 2025-10-04 22:19:57 +03:00
parent 3f14b99f24
commit 2965aaf3e3
46 changed files with 600 additions and 809 deletions

View file

@ -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;

View file

@ -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_)

View file

@ -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

View file

@ -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();

View file

@ -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,

View file

@ -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:

View file

@ -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;
};

View file

@ -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);

View file

@ -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:

View file

@ -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 &

View file

@ -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))

View file

@ -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) {

View file

@ -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);

View file

@ -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);

View file

@ -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 {};

View file

@ -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