mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-15 19:28:43 +12:00
Mega-cleanup for atomic_t<> and named bit-sets bs_t<>
Remove "atomic operator" classes Remove test, test_and_set, test_and_reset, test_and_complement global functions Simplify atomic_t<> with constexpr if, remove some garbage Redesign bs_t<> to use class, mark its methods constexpr Implement atomic_bs_t<> for optimizations Remove unused __bitwise_ops concept (should be in other header anyway) Bitsets can now be tested via safe bool conversion
This commit is contained in:
parent
a6d06b2e20
commit
8abe6489ed
23 changed files with 604 additions and 1090 deletions
|
@ -52,10 +52,10 @@ void cpu_thread::on_task()
|
|||
g_tls_current_cpu_thread = this;
|
||||
|
||||
// Check thread status
|
||||
while (!test(state, cpu_flag::exit + cpu_flag::dbg_global_stop))
|
||||
while (!(state & (cpu_flag::exit + cpu_flag::dbg_global_stop)))
|
||||
{
|
||||
// Check stop status
|
||||
if (!test(state & cpu_flag::stop))
|
||||
if (!(state & cpu_flag::stop))
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -100,7 +100,8 @@ cpu_thread::cpu_thread(u32 id)
|
|||
bool cpu_thread::check_state()
|
||||
{
|
||||
#ifdef WITH_GDB_DEBUGGER
|
||||
if (test(state, cpu_flag::dbg_pause)) {
|
||||
if (state & cpu_flag::dbg_pause)
|
||||
{
|
||||
fxm::get<GDBDebugServer>()->pause_from(this);
|
||||
}
|
||||
#endif
|
||||
|
@ -110,7 +111,7 @@ bool cpu_thread::check_state()
|
|||
|
||||
while (true)
|
||||
{
|
||||
if (test(state, cpu_flag::memory) && state.test_and_reset(cpu_flag::memory))
|
||||
if (state & cpu_flag::memory && state.test_and_reset(cpu_flag::memory))
|
||||
{
|
||||
cpu_flag_memory = true;
|
||||
|
||||
|
@ -121,17 +122,17 @@ bool cpu_thread::check_state()
|
|||
}
|
||||
}
|
||||
|
||||
if (test(state, cpu_flag::exit + cpu_flag::dbg_global_stop))
|
||||
if (state & cpu_flag::exit + cpu_flag::dbg_global_stop)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (test(state & cpu_flag::signal) && state.test_and_reset(cpu_flag::signal))
|
||||
if (state & cpu_flag::signal && state.test_and_reset(cpu_flag::signal))
|
||||
{
|
||||
cpu_sleep_called = false;
|
||||
}
|
||||
|
||||
if (!test(state, cpu_state_pause))
|
||||
if (!(state & cpu_state_pause))
|
||||
{
|
||||
if (cpu_flag_memory)
|
||||
{
|
||||
|
@ -140,7 +141,7 @@ bool cpu_thread::check_state()
|
|||
|
||||
break;
|
||||
}
|
||||
else if (!cpu_sleep_called && test(state, cpu_flag::suspend))
|
||||
else if (!cpu_sleep_called && state & cpu_flag::suspend)
|
||||
{
|
||||
cpu_sleep();
|
||||
cpu_sleep_called = true;
|
||||
|
@ -152,12 +153,12 @@ bool cpu_thread::check_state()
|
|||
|
||||
const auto state_ = state.load();
|
||||
|
||||
if (test(state_, cpu_flag::ret + cpu_flag::stop))
|
||||
if (state_ & (cpu_flag::ret + cpu_flag::stop))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (test(state_, cpu_flag::dbg_step))
|
||||
if (state_ & cpu_flag::dbg_step)
|
||||
{
|
||||
state += cpu_flag::dbg_pause;
|
||||
state -= cpu_flag::dbg_step;
|
||||
|
@ -168,7 +169,7 @@ bool cpu_thread::check_state()
|
|||
|
||||
void cpu_thread::test_state()
|
||||
{
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
if (check_state())
|
||||
{
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
cpu_thread(u32 id);
|
||||
|
||||
// Public thread state
|
||||
atomic_t<bs_t<cpu_flag>> state{+cpu_flag::stop};
|
||||
atomic_bs_t<cpu_flag> state{+cpu_flag::stop};
|
||||
|
||||
// Process thread state, return true if the checker must return
|
||||
bool check_state();
|
||||
|
|
|
@ -148,7 +148,7 @@ error_code sys_lwcond_signal_all(ppu_thread& ppu, vm::ptr<sys_lwcond_t> lwcond)
|
|||
}
|
||||
|
||||
ppu.test_state();
|
||||
lwmutex->all_info += res;
|
||||
lwmutex->all_info += +res;
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ error_code sys_lwcond_signal_all(ppu_thread& ppu, vm::ptr<sys_lwcond_t> lwcond)
|
|||
|
||||
if (res > 0)
|
||||
{
|
||||
lwmutex->all_info += res;
|
||||
lwmutex->all_info += +res;
|
||||
|
||||
res = CELL_OK;
|
||||
}
|
||||
|
|
|
@ -1051,7 +1051,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
}
|
||||
|
||||
// Get function limit
|
||||
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), test(func.attr, ppu_attr::known_size) ? func.addr + func.size : end);
|
||||
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), func.attr & ppu_attr::known_size ? func.addr + func.size : end);
|
||||
|
||||
// Block analysis workload
|
||||
std::vector<std::reference_wrapper<std::pair<const u32, u32>>> block_queue;
|
||||
|
@ -1084,7 +1084,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
}
|
||||
|
||||
// TODO: lower priority?
|
||||
if (test(func.attr, ppu_attr::no_size))
|
||||
if (func.attr & ppu_attr::no_size)
|
||||
{
|
||||
// Get next function
|
||||
const auto _next = fmap.lower_bound(func.blocks.crbegin()->first + 1);
|
||||
|
@ -1135,12 +1135,12 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
}
|
||||
|
||||
// Add next block if necessary
|
||||
if ((is_call && !test(pfunc->attr, ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
|
||||
if ((is_call && !(pfunc->attr & ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
|
||||
{
|
||||
add_block(_ptr.addr());
|
||||
}
|
||||
|
||||
if (is_call && test(pfunc->attr, ppu_attr::no_return))
|
||||
if (is_call && pfunc->attr & ppu_attr::no_return)
|
||||
{
|
||||
// Nothing
|
||||
}
|
||||
|
@ -1201,7 +1201,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
if (jt_addr != jt_end && _ptr.addr() == jt_addr)
|
||||
{
|
||||
// Acknowledge jumptable detection failure
|
||||
if (!test(func.attr, ppu_attr::no_size))
|
||||
if (!(func.attr & ppu_attr::no_size))
|
||||
{
|
||||
LOG_WARNING(PPU, "[0x%x] Jump table not found! 0x%x-0x%x", func.addr, jt_addr, jt_end);
|
||||
}
|
||||
|
@ -1235,7 +1235,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
block.second = _ptr.addr() - block.first;
|
||||
break;
|
||||
}
|
||||
else if (type == ppu_itype::STDU && test(func.attr, ppu_attr::no_size) && (op.opcode == *_ptr || *_ptr == ppu_instructions::BLR()))
|
||||
else if (type == ppu_itype::STDU && func.attr & ppu_attr::no_size && (op.opcode == *_ptr || *_ptr == ppu_instructions::BLR()))
|
||||
{
|
||||
// Hack
|
||||
LOG_SUCCESS(PPU, "[0x%x] Instruction repetition: 0x%08x", iaddr, op.opcode);
|
||||
|
@ -1254,7 +1254,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
}
|
||||
|
||||
// Finalization: determine function size
|
||||
if (!test(func.attr, ppu_attr::known_size))
|
||||
if (!(func.attr & ppu_attr::known_size))
|
||||
{
|
||||
const auto last = func.blocks.crbegin();
|
||||
|
||||
|
@ -1320,7 +1320,7 @@ void ppu_module::analyse(u32 lib_toc, u32 entry)
|
|||
}
|
||||
|
||||
// Finalization: decrease known function size (TODO)
|
||||
if (test(func.attr, ppu_attr::known_size))
|
||||
if (func.attr & ppu_attr::known_size)
|
||||
{
|
||||
const auto last = func.blocks.crbegin();
|
||||
|
||||
|
|
|
@ -1167,7 +1167,7 @@ void ppu_load_exec(const ppu_exec_object& elf)
|
|||
|
||||
if (info.size < sizeof(process_param_t))
|
||||
{
|
||||
LOG_WARNING(LOADER, "Bad process_param size! [0x%x : 0x%x]", info.size, SIZE_32(process_param_t));
|
||||
LOG_WARNING(LOADER, "Bad process_param size! [0x%x : 0x%x]", info.size, sizeof(process_param_t));
|
||||
}
|
||||
|
||||
if (info.magic != 0x13bcc5f6)
|
||||
|
|
|
@ -607,7 +607,7 @@ void ppu_thread::exec_task()
|
|||
{
|
||||
if (g_cfg.core.ppu_decoder == ppu_decoder_type::llvm)
|
||||
{
|
||||
while (!test(state, cpu_flag::ret + cpu_flag::exit + cpu_flag::stop + cpu_flag::dbg_global_stop))
|
||||
while (!(state & (cpu_flag::ret + cpu_flag::exit + cpu_flag::stop + cpu_flag::dbg_global_stop)))
|
||||
{
|
||||
reinterpret_cast<ppu_function_t>(static_cast<std::uintptr_t>(ppu_ref(cia)))(*this);
|
||||
}
|
||||
|
@ -625,7 +625,7 @@ void ppu_thread::exec_task()
|
|||
|
||||
while (true)
|
||||
{
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
if (check_state()) return;
|
||||
|
||||
|
@ -678,7 +678,7 @@ void ppu_thread::exec_task()
|
|||
func2 = func4;
|
||||
func3 = func5;
|
||||
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -763,9 +763,9 @@ cmd64 ppu_thread::cmd_wait()
|
|||
{
|
||||
while (true)
|
||||
{
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
if (test(state, cpu_flag::stop + cpu_flag::exit))
|
||||
if (state & (cpu_flag::stop + cpu_flag::exit))
|
||||
{
|
||||
return cmd64{};
|
||||
}
|
||||
|
|
|
@ -1183,7 +1183,7 @@ static void check_state_ret(SPUThread& _spu, void*, u8*)
|
|||
|
||||
static void check_state(SPUThread* _spu, spu_function_t _ret)
|
||||
{
|
||||
if (test(_spu->state) && _spu->check_state())
|
||||
if (_spu->state && _spu->check_state())
|
||||
{
|
||||
_ret = &check_state_ret;
|
||||
}
|
||||
|
|
|
@ -490,7 +490,7 @@ std::vector<u32> spu_recompiler_base::block(const be_t<u32>* ls, u32 entry_point
|
|||
}
|
||||
}
|
||||
|
||||
if (test(af, vf::is_const))
|
||||
if (af & vf::is_const)
|
||||
{
|
||||
const u32 target = spu_branch_target(av);
|
||||
|
||||
|
@ -858,7 +858,7 @@ std::vector<u32> spu_recompiler_base::block(const be_t<u32>* ls, u32 entry_point
|
|||
case spu_itype::HBR:
|
||||
{
|
||||
hbr_loc = spu_branch_target(pos, op.roh << 7 | op.rt);
|
||||
hbr_tg = test(vflags[op.ra], vf::is_const) && !op.c ? values[op.ra] & 0x3fffc : -1;
|
||||
hbr_tg = vflags[op.ra] & vf::is_const && !op.c ? values[op.ra] & 0x3fffc : -1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1017,7 +1017,7 @@ std::vector<u32> spu_recompiler_base::block(const be_t<u32>* ls, u32 entry_point
|
|||
{
|
||||
const u32 r2 = op.ra == 1 ? +op.rb : +op.ra;
|
||||
|
||||
if (test(vflags[r2], vf::is_const) && (values[r2] % 16) == 0)
|
||||
if (vflags[r2] & vf::is_const && (values[r2] % 16) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -521,7 +521,7 @@ void SPUThread::cpu_task()
|
|||
|
||||
if (jit)
|
||||
{
|
||||
while (LIKELY(!test(state) || !check_state()))
|
||||
while (LIKELY(!state || !check_state()))
|
||||
{
|
||||
jit_dispatcher[pc / 4](*this, vm::_ptr<u8>(offset), nullptr);
|
||||
}
|
||||
|
@ -547,7 +547,7 @@ void SPUThread::cpu_task()
|
|||
|
||||
while (true)
|
||||
{
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
if (check_state()) return;
|
||||
|
||||
|
@ -594,7 +594,7 @@ void SPUThread::cpu_task()
|
|||
func2 = func4;
|
||||
func3 = func5;
|
||||
|
||||
if (UNLIKELY(test(state)))
|
||||
if (UNLIKELY(state))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -1093,7 +1093,7 @@ void SPUThread::do_mfc(bool wait)
|
|||
|
||||
if (args.cmd & MFC_LIST_MASK)
|
||||
{
|
||||
if (!test(ch_stall_mask, mask))
|
||||
if (!(ch_stall_mask & mask))
|
||||
{
|
||||
if (do_list_transfer(args))
|
||||
{
|
||||
|
@ -1160,7 +1160,7 @@ bool SPUThread::process_mfc_cmd(spu_mfc_cmd args)
|
|||
// Stall infinitely if MFC queue is full
|
||||
while (UNLIKELY(mfc_size >= 16))
|
||||
{
|
||||
if (test(state, cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1193,7 +1193,7 @@ bool SPUThread::process_mfc_cmd(spu_mfc_cmd args)
|
|||
|
||||
while (rdata == data && vm::reservation_acquire(raddr, 128) == rtime)
|
||||
{
|
||||
if (test(state, cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -1400,7 +1400,7 @@ bool SPUThread::process_mfc_cmd(spu_mfc_cmd args)
|
|||
{
|
||||
if (LIKELY(args.size <= 0x4000))
|
||||
{
|
||||
if (LIKELY(do_dma_check(args) && !test(ch_stall_mask, 1u << args.tag)))
|
||||
if (LIKELY(do_dma_check(args) && !(ch_stall_mask & 1u << args.tag)))
|
||||
{
|
||||
if (LIKELY(do_list_transfer(args)))
|
||||
{
|
||||
|
@ -1558,7 +1558,7 @@ s64 SPUThread::get_ch_value(u32 ch)
|
|||
|
||||
while (!channel.try_pop(out))
|
||||
{
|
||||
if (test(state, cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -1596,7 +1596,7 @@ s64 SPUThread::get_ch_value(u32 ch)
|
|||
return out;
|
||||
}
|
||||
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -1700,7 +1700,7 @@ s64 SPUThread::get_ch_value(u32 ch)
|
|||
|
||||
while (res = get_events(), !res)
|
||||
{
|
||||
if (test(state, cpu_flag::stop + cpu_flag::dbg_global_stop))
|
||||
if (state & (cpu_flag::stop + cpu_flag::dbg_global_stop))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -1713,7 +1713,7 @@ s64 SPUThread::get_ch_value(u32 ch)
|
|||
|
||||
while (res = get_events(true), !res)
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
@ -1753,7 +1753,7 @@ bool SPUThread::set_ch_value(u32 ch, u32 value)
|
|||
{
|
||||
while (!ch_out_intr_mbox.try_push(value))
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1899,7 +1899,7 @@ bool SPUThread::set_ch_value(u32 ch, u32 value)
|
|||
{
|
||||
while (!ch_out_mbox.try_push(value))
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -2005,8 +2005,11 @@ bool SPUThread::set_ch_value(u32 ch, u32 value)
|
|||
case MFC_WrListStallAck:
|
||||
{
|
||||
// Reset stall status for specified tag
|
||||
if (::test_and_reset(ch_stall_mask, 1u << value))
|
||||
const u32 tag_mask = 1u << value;
|
||||
|
||||
if (ch_stall_mask & tag_mask)
|
||||
{
|
||||
ch_stall_mask &= ~tag_mask;
|
||||
do_mfc(true);
|
||||
}
|
||||
|
||||
|
@ -2085,7 +2088,7 @@ bool SPUThread::stop_and_signal(u32 code)
|
|||
// HACK: wait for executable code
|
||||
while (!_ref<u32>(pc))
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -2141,7 +2144,7 @@ bool SPUThread::stop_and_signal(u32 code)
|
|||
// Check group status, wait if necessary
|
||||
while (group->run_state >= SPU_THREAD_GROUP_STATUS_WAITING && group->run_state <= SPU_THREAD_GROUP_STATUS_SUSPENDED)
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -2210,7 +2213,7 @@ bool SPUThread::stop_and_signal(u32 code)
|
|||
|
||||
while (true)
|
||||
{
|
||||
if (test(state & cpu_flag::stop))
|
||||
if (state & cpu_flag::stop)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1014,13 +1014,13 @@ void lv2_obj::sleep_timeout(named_thread& thread, u64 timeout)
|
|||
|
||||
auto state = ppu->state.fetch_op([&](auto& val)
|
||||
{
|
||||
if (!test(val, cpu_flag::signal))
|
||||
if (!(val & cpu_flag::signal))
|
||||
{
|
||||
val += cpu_flag::suspend;
|
||||
}
|
||||
});
|
||||
|
||||
if (test(state, cpu_flag::signal))
|
||||
if (state & cpu_flag::signal)
|
||||
{
|
||||
LOG_TRACE(PPU, "sleep() failed (signaled)");
|
||||
return;
|
||||
|
@ -1156,7 +1156,7 @@ void lv2_obj::schedule_all()
|
|||
{
|
||||
const auto target = g_ppu[i];
|
||||
|
||||
if (test(target->state, cpu_flag::suspend))
|
||||
if (target->state & cpu_flag::suspend)
|
||||
{
|
||||
LOG_TRACE(PPU, "schedule(): %s", target->id);
|
||||
target->state ^= (cpu_flag::signal + cpu_flag::suspend);
|
||||
|
|
|
@ -275,7 +275,7 @@ error_code sys_fs_open(vm::cptr<char> path, s32 flags, vm::ptr<u32> fd, s32 mode
|
|||
open_mode = {}; // error
|
||||
}
|
||||
|
||||
if (!test(open_mode))
|
||||
if (!open_mode)
|
||||
{
|
||||
fmt::throw_exception("sys_fs_open(%s): Invalid or unimplemented flags: %#o" HERE, path, flags);
|
||||
}
|
||||
|
@ -307,7 +307,7 @@ error_code sys_fs_open(vm::cptr<char> path, s32 flags, vm::ptr<u32> fd, s32 mode
|
|||
|
||||
if (!file)
|
||||
{
|
||||
if (test(open_mode & fs::excl) && fs::g_tls_error == fs::error::exist)
|
||||
if (open_mode & fs::excl && fs::g_tls_error == fs::error::exist)
|
||||
{
|
||||
return not_an_error(CELL_EEXIST);
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ error_code _sys_interrupt_thread_establish(vm::ptr<u32> ih, u32 intrtag, u32 int
|
|||
}
|
||||
|
||||
// If interrupt thread is running, it's already established on another interrupt tag
|
||||
if (!test(it->state & cpu_flag::stop))
|
||||
if (!(it->state & cpu_flag::stop))
|
||||
{
|
||||
error = CELL_EAGAIN;
|
||||
return result;
|
||||
|
|
|
@ -105,7 +105,7 @@ static void network_clear_queue(ppu_thread& ppu)
|
|||
|
||||
if (sock.queue.empty())
|
||||
{
|
||||
sock.events = {};
|
||||
sock.events.store({});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -180,11 +180,11 @@ extern void network_thread_init()
|
|||
events += lv2_socket::poll::error;
|
||||
#endif
|
||||
|
||||
if (test(events))
|
||||
if (events)
|
||||
{
|
||||
semaphore_lock lock(socklist[i]->mutex);
|
||||
|
||||
for (auto it = socklist[i]->queue.begin(); test(events) && it != socklist[i]->queue.end();)
|
||||
for (auto it = socklist[i]->queue.begin(); events && it != socklist[i]->queue.end();)
|
||||
{
|
||||
if (it->second(events))
|
||||
{
|
||||
|
@ -197,7 +197,7 @@ extern void network_thread_init()
|
|||
|
||||
if (socklist[i]->queue.empty())
|
||||
{
|
||||
socklist[i]->events = {};
|
||||
socklist[i]->events.store({});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -226,10 +226,10 @@ extern void network_thread_init()
|
|||
#ifdef _WIN32
|
||||
verify(HERE), 0 == WSAEventSelect(socklist[i]->socket, _eventh, FD_READ | FD_ACCEPT | FD_CLOSE | FD_WRITE | FD_CONNECT);
|
||||
#else
|
||||
fds[i].fd = test(events) ? socklist[i]->socket : -1;
|
||||
fds[i].fd = events ? socklist[i]->socket : -1;
|
||||
fds[i].events =
|
||||
(test(events, lv2_socket::poll::read) ? POLLIN : 0) |
|
||||
(test(events, lv2_socket::poll::write) ? POLLOUT : 0) |
|
||||
(events & lv2_socket::poll::read ? POLLIN : 0) |
|
||||
(events & lv2_socket::poll::write ? POLLOUT : 0) |
|
||||
0;
|
||||
fds[i].revents = 0;
|
||||
#endif
|
||||
|
@ -278,7 +278,7 @@ s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr,
|
|||
{
|
||||
semaphore_lock lock(sock.mutex);
|
||||
|
||||
//if (!test(sock.events, lv2_socket::poll::read))
|
||||
//if (!(sock.events & lv2_socket::poll::read))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_ACCEPT;
|
||||
|
@ -302,7 +302,7 @@ s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr,
|
|||
sock.events += lv2_socket::poll::read;
|
||||
sock.queue.emplace_back(ppu.id, [&](bs_t<lv2_socket::poll> events) -> bool
|
||||
{
|
||||
if (test(events, lv2_socket::poll::read))
|
||||
if (events & lv2_socket::poll::read)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_ACCEPT;
|
||||
|
@ -472,7 +472,7 @@ s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr,
|
|||
sock.events += lv2_socket::poll::write;
|
||||
sock.queue.emplace_back(u32{0}, [&sock](bs_t<lv2_socket::poll> events) -> bool
|
||||
{
|
||||
if (test(events, lv2_socket::poll::write))
|
||||
if (events & lv2_socket::poll::write)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_CONNECT;
|
||||
|
@ -503,7 +503,7 @@ s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr,
|
|||
sock.events += lv2_socket::poll::write;
|
||||
sock.queue.emplace_back(ppu.id, [&](bs_t<lv2_socket::poll> events) -> bool
|
||||
{
|
||||
if (test(events, lv2_socket::poll::write))
|
||||
if (events & lv2_socket::poll::write)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_CONNECT;
|
||||
|
@ -886,7 +886,7 @@ s32 sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32 len, s3
|
|||
{
|
||||
semaphore_lock lock(sock.mutex);
|
||||
|
||||
//if (!test(sock.events, lv2_socket::poll::read))
|
||||
//if (!(sock.events & lv2_socket::poll::read))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!(native_flags & MSG_PEEK)) sock.ev_set &= ~FD_READ;
|
||||
|
@ -910,7 +910,7 @@ s32 sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32 len, s3
|
|||
sock.events += lv2_socket::poll::read;
|
||||
sock.queue.emplace_back(ppu.id, [&](bs_t<lv2_socket::poll> events) -> bool
|
||||
{
|
||||
if (test(events, lv2_socket::poll::read))
|
||||
if (events & lv2_socket::poll::read)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (!(native_flags & MSG_PEEK)) sock.ev_set &= ~FD_READ;
|
||||
|
@ -1039,7 +1039,7 @@ s32 sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 len, s32
|
|||
{
|
||||
semaphore_lock lock(sock.mutex);
|
||||
|
||||
//if (!test(sock.events, lv2_socket::poll::write))
|
||||
//if (!(sock.events & lv2_socket::poll::write))
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_WRITE;
|
||||
|
@ -1063,7 +1063,7 @@ s32 sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 len, s32
|
|||
sock.events += lv2_socket::poll::write;
|
||||
sock.queue.emplace_back(ppu.id, [&](bs_t<lv2_socket::poll> events) -> bool
|
||||
{
|
||||
if (test(events, lv2_socket::poll::write))
|
||||
if (events & lv2_socket::poll::write)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
sock.ev_set &= ~FD_WRITE;
|
||||
|
@ -1517,13 +1517,13 @@ s32 sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 nfds, s3
|
|||
sock->events += selected;
|
||||
sock->queue.emplace_back(ppu.id, [sock, selected, fds, i, &signaled, &ppu](bs_t<lv2_socket::poll> events)
|
||||
{
|
||||
if (test(events, selected))
|
||||
if (events & selected)
|
||||
{
|
||||
if (test(events, selected & lv2_socket::poll::read))
|
||||
if (events & selected & lv2_socket::poll::read)
|
||||
fds[i].revents |= SYS_NET_POLLIN;
|
||||
if (test(events, selected & lv2_socket::poll::write))
|
||||
if (events & selected & lv2_socket::poll::write)
|
||||
fds[i].revents |= SYS_NET_POLLOUT;
|
||||
if (test(events, selected & lv2_socket::poll::error))
|
||||
if (events & selected & lv2_socket::poll::error)
|
||||
fds[i].revents |= SYS_NET_POLLERR;
|
||||
|
||||
signaled++;
|
||||
|
@ -1615,7 +1615,7 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readf
|
|||
//if (exceptfds && exceptfds->bit(i))
|
||||
// selected += lv2_socket::poll::error;
|
||||
|
||||
if (test(selected))
|
||||
if (selected)
|
||||
{
|
||||
selected += lv2_socket::poll::error;
|
||||
}
|
||||
|
@ -1628,9 +1628,9 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readf
|
|||
{
|
||||
#ifdef _WIN32
|
||||
bool sig = false;
|
||||
if (sock->ev_set & (FD_READ | FD_ACCEPT | FD_CLOSE) && test(selected, lv2_socket::poll::read))
|
||||
if (sock->ev_set & (FD_READ | FD_ACCEPT | FD_CLOSE) && selected & lv2_socket::poll::read)
|
||||
sig = true, rread.set(i);
|
||||
if (sock->ev_set & (FD_WRITE | FD_CONNECT) && test(selected, lv2_socket::poll::write))
|
||||
if (sock->ev_set & (FD_WRITE | FD_CONNECT) && selected & lv2_socket::poll::write)
|
||||
sig = true, rwrite.set(i);
|
||||
|
||||
if (sig)
|
||||
|
@ -1639,9 +1639,9 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readf
|
|||
}
|
||||
#else
|
||||
_fds[i].fd = sock->socket;
|
||||
if (test(selected, lv2_socket::poll::read))
|
||||
if (selected & lv2_socket::poll::read)
|
||||
_fds[i].events |= POLLIN;
|
||||
if (test(selected, lv2_socket::poll::write))
|
||||
if (selected & lv2_socket::poll::write)
|
||||
_fds[i].events |= POLLOUT;
|
||||
#endif
|
||||
}
|
||||
|
@ -1691,7 +1691,7 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readf
|
|||
//if (exceptfds && exceptfds->bit(i))
|
||||
// selected += lv2_socket::poll::error;
|
||||
|
||||
if (test(selected))
|
||||
if (selected)
|
||||
{
|
||||
selected += lv2_socket::poll::error;
|
||||
}
|
||||
|
@ -1707,13 +1707,13 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readf
|
|||
sock->events += selected;
|
||||
sock->queue.emplace_back(ppu.id, [sock, selected, i, &rread, &rwrite, &rexcept, &signaled, &ppu](bs_t<lv2_socket::poll> events)
|
||||
{
|
||||
if (test(events, selected))
|
||||
if (events & selected)
|
||||
{
|
||||
if (test(selected, lv2_socket::poll::read) && test(events, lv2_socket::poll::read + lv2_socket::poll::error))
|
||||
if (selected & lv2_socket::poll::read && events & (lv2_socket::poll::read + lv2_socket::poll::error))
|
||||
rread.set(i);
|
||||
if (test(selected, lv2_socket::poll::write) && test(events, lv2_socket::poll::write + lv2_socket::poll::error))
|
||||
if (selected & lv2_socket::poll::write && events & (lv2_socket::poll::write + lv2_socket::poll::error))
|
||||
rwrite.set(i);
|
||||
//if (test(events, selected & lv2_socket::poll::error))
|
||||
//if (events & (selected & lv2_socket::poll::error))
|
||||
// rexcept.set(i);
|
||||
|
||||
signaled++;
|
||||
|
|
|
@ -335,7 +335,7 @@ struct lv2_socket final
|
|||
socket_type socket;
|
||||
|
||||
// Events selected for polling
|
||||
atomic_t<bs_t<poll>> events{};
|
||||
atomic_bs_t<poll> events{};
|
||||
|
||||
// Non-blocking IO option
|
||||
s32 so_nbio = 0;
|
||||
|
|
|
@ -114,7 +114,7 @@ namespace vm
|
|||
*ptr = nullptr;
|
||||
ptr = nullptr;
|
||||
|
||||
if (test(cpu.state, cpu_flag::memory))
|
||||
if (cpu.state & cpu_flag::memory)
|
||||
{
|
||||
cpu.state -= cpu_flag::memory;
|
||||
}
|
||||
|
@ -221,7 +221,7 @@ namespace vm
|
|||
{
|
||||
while (cpu_thread* ptr = lock)
|
||||
{
|
||||
if (test(ptr->state, cpu_flag::dbg_global_stop + cpu_flag::exit))
|
||||
if (ptr->state & (cpu_flag::dbg_global_stop + cpu_flag::exit))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -243,8 +243,8 @@ public:
|
|||
|
||||
// Load program headers
|
||||
std::vector<phdr_t> _phdrs;
|
||||
|
||||
if (!test(opts, elf_opt::no_programs))
|
||||
|
||||
if (!(opts & elf_opt::no_programs))
|
||||
{
|
||||
_phdrs.resize(header.e_phnum);
|
||||
stream.seek(offset + header.e_phoff);
|
||||
|
@ -252,7 +252,7 @@ public:
|
|||
return set_error(elf_error::stream_phdrs);
|
||||
}
|
||||
|
||||
if (!test(opts, elf_opt::no_sections))
|
||||
if (!(opts & elf_opt::no_sections))
|
||||
{
|
||||
shdrs.resize(header.e_shnum);
|
||||
stream.seek(offset + header.e_shoff);
|
||||
|
@ -268,7 +268,7 @@ public:
|
|||
|
||||
static_cast<phdr_t&>(progs.back()) = hdr;
|
||||
|
||||
if (!test(opts, elf_opt::no_data))
|
||||
if (!(opts & elf_opt::no_data))
|
||||
{
|
||||
progs.back().bin.resize(hdr.p_filesz);
|
||||
stream.seek(offset + hdr.p_offset);
|
||||
|
|
|
@ -112,7 +112,7 @@ debugger_frame::debugger_frame(std::shared_ptr<gui_settings> settings, QWidget *
|
|||
{
|
||||
if (m_btn_run->text() == RunString && cpu->state.test_and_reset(cpu_flag::dbg_pause))
|
||||
{
|
||||
if (!test(cpu->state, cpu_flag::dbg_pause + cpu_flag::dbg_global_pause))
|
||||
if (!(cpu->state & (cpu_flag::dbg_pause + cpu_flag::dbg_global_pause)))
|
||||
{
|
||||
cpu->notify();
|
||||
}
|
||||
|
@ -293,7 +293,7 @@ void debugger_frame::UpdateUI()
|
|||
m_last_stat = static_cast<u32>(state);
|
||||
DoUpdate();
|
||||
|
||||
if (test(state & cpu_flag::dbg_pause))
|
||||
if (state & cpu_flag::dbg_pause)
|
||||
{
|
||||
m_btn_run->setText(RunString);
|
||||
m_btn_step->setEnabled(true);
|
||||
|
@ -570,13 +570,13 @@ void debugger_frame::DoStep(bool stepOver)
|
|||
{
|
||||
bool should_step_over = stepOver && cpu->id_type() == 1;
|
||||
|
||||
if (test(cpu_flag::dbg_pause, cpu->state.fetch_op([&](bs_t<cpu_flag>& state)
|
||||
if (+cpu_flag::dbg_pause & +cpu->state.fetch_op([&](bs_t<cpu_flag>& state)
|
||||
{
|
||||
if (!should_step_over)
|
||||
state += cpu_flag::dbg_step;
|
||||
|
||||
state -= cpu_flag::dbg_pause;
|
||||
})))
|
||||
}))
|
||||
{
|
||||
if (should_step_over)
|
||||
{
|
||||
|
@ -592,7 +592,7 @@ void debugger_frame::DoStep(bool stepOver)
|
|||
{
|
||||
m_breakpoint_handler->RemoveBreakpoint(next_instruction_pc);
|
||||
}
|
||||
|
||||
|
||||
m_last_step_over_breakpoint = next_instruction_pc;
|
||||
}
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ void debugger_list::ShowAddress(u32 addr)
|
|||
|
||||
item(i)->setText((IsBreakpoint(m_pc) ? ">>> " : " ") + qstr(m_disasm->last_opcode));
|
||||
|
||||
if (test(cpu->state & cpu_state_pause) && m_pc == GetPc())
|
||||
if (cpu->state & cpu_state_pause && m_pc == GetPc())
|
||||
{
|
||||
item(i)->setTextColor(m_text_color_pc);
|
||||
item(i)->setBackgroundColor(m_color_pc);
|
||||
|
|
|
@ -94,7 +94,7 @@ struct gui_listener : logs::listener
|
|||
|
||||
void pop()
|
||||
{
|
||||
if (const auto head = read->next.exchange(nullptr))
|
||||
if (const auto head = read.load()->next.exchange(nullptr))
|
||||
{
|
||||
delete read.exchange(head);
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ struct gui_listener : logs::listener
|
|||
|
||||
void clear()
|
||||
{
|
||||
while (read->next)
|
||||
while (read.load()->next)
|
||||
{
|
||||
pop();
|
||||
}
|
||||
|
@ -502,7 +502,7 @@ void log_frame::UpdateUI()
|
|||
}
|
||||
|
||||
// Check main logs
|
||||
while (const auto packet = s_gui_listener.read->next.load())
|
||||
while (const auto packet = s_gui_listener.read.load()->next.load())
|
||||
{
|
||||
// Confirm log level
|
||||
if (packet->sev <= s_gui_listener.enabled)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue