diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 6b22d8df3c..e70eafdbed 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -2072,7 +2072,7 @@ void thread_ctrl::join() { // Hard way std::unique_lock lock(m_data->mutex); - m_data->jcv.wait(lock, WRAP_EXPR(m_joining >= 0x80000000)); + m_data->jcv.wait(lock, [&] { return m_joining >= 0x80000000; }); } if (UNLIKELY(m_data && m_data->exception && !std::uncaught_exception())) diff --git a/Utilities/types.h b/Utilities/types.h index 2a98a0ec15..8f34744100 100644 --- a/Utilities/types.h +++ b/Utilities/types.h @@ -58,9 +58,6 @@ #define HERE "\n(in file " __FILE__ ":" STRINGIZE(__LINE__) ")" -// Wrap an expression into lambda. Obsolete. -#define WRAP_EXPR(...) [&] { return __VA_ARGS__; } - // Ensure that the expression evaluates to true. Obsolete. //#define EXPECTS(...) do { if (!(__VA_ARGS__)) fmt::raw_error("Precondition failed: " #__VA_ARGS__ HERE); } while (0) //#define ENSURES(...) do { if (!(__VA_ARGS__)) fmt::raw_error("Postcondition failed: " #__VA_ARGS__ HERE); } while (0) diff --git a/rpcs3/Emu/Cell/Modules/cellSync.cpp b/rpcs3/Emu/Cell/Modules/cellSync.cpp index eaa0a76f70..710fa5639d 100644 --- a/rpcs3/Emu/Cell/Modules/cellSync.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSync.cpp @@ -67,7 +67,7 @@ ppu_error_code cellSyncMutexLock(vm::ptr mutex) const auto order = mutex->ctrl.atomic_op(_sync::mutex_acquire); // wait until rel value is equal to old acq value - vm::wait_op(mutex.addr(), 4, WRAP_EXPR(mutex->ctrl.load().rel == order)); + vm::wait_op(mutex.addr(), 4, [&] { return mutex->ctrl.load().rel == order; }); _mm_mfence(); @@ -156,7 +156,7 @@ ppu_error_code cellSyncBarrierNotify(vm::ptr barrier) return CELL_SYNC_ERROR_ALIGN; } - vm::wait_op(barrier.addr(), 4, WRAP_EXPR(barrier->ctrl.atomic_op(_sync::barrier::try_notify))); + vm::wait_op(barrier.addr(), 4, [&] { return barrier->ctrl.atomic_op(_sync::barrier::try_notify); }); vm::notify_at(barrier.addr(), 4); @@ -205,7 +205,7 @@ ppu_error_code cellSyncBarrierWait(vm::ptr barrier) _mm_mfence(); - vm::wait_op(barrier.addr(), 4, WRAP_EXPR(barrier->ctrl.atomic_op(_sync::barrier::try_wait))); + vm::wait_op(barrier.addr(), 4, [&] { return barrier->ctrl.atomic_op(_sync::barrier::try_wait); }); vm::notify_at(barrier.addr(), 4); @@ -282,7 +282,7 @@ ppu_error_code cellSyncRwmRead(vm::ptr rwm, vm::ptr buffer) } // wait until `writers` is zero, increase `readers` - vm::wait_op(rwm.addr(), 8, WRAP_EXPR(rwm->ctrl.atomic_op(_sync::rwlock::try_read_begin))); + vm::wait_op(rwm.addr(), 8, [&] { return rwm->ctrl.atomic_op(_sync::rwlock::try_read_begin); }); // copy data to buffer std::memcpy(buffer.get_ptr(), rwm->buffer.get_ptr(), rwm->size); @@ -347,10 +347,10 @@ ppu_error_code cellSyncRwmWrite(vm::ptr rwm, vm::cptr buffer) } // wait until `writers` is zero, set to 1 - vm::wait_op(rwm.addr(), 8, WRAP_EXPR(rwm->ctrl.atomic_op(_sync::rwlock::try_write_begin))); + vm::wait_op(rwm.addr(), 8, [&] { return rwm->ctrl.atomic_op(_sync::rwlock::try_write_begin); }); // wait until `readers` is zero - vm::wait_op(rwm.addr(), 8, WRAP_EXPR(!rwm->ctrl.load().readers)); + vm::wait_op(rwm.addr(), 8, [&] { return rwm->ctrl.load().readers == 0; }); // copy data from buffer std::memcpy(rwm->buffer.get_ptr(), buffer.get_ptr(), rwm->size); @@ -447,7 +447,7 @@ ppu_error_code cellSyncQueuePush(vm::ptr queue, vm::cptr bu u32 position; - vm::wait_op(queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_push_begin, depth, &position))); + vm::wait_op(queue.addr(), 8, [&] { return queue->ctrl.atomic_op(_sync::queue::try_push_begin, depth, &position); }); // copy data from the buffer at the position std::memcpy(&queue->buffer[position * queue->size], buffer.get_ptr(), queue->size); @@ -512,7 +512,7 @@ ppu_error_code cellSyncQueuePop(vm::ptr queue, vm::ptr buff u32 position; - vm::wait_op(queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_pop_begin, depth, &position))); + vm::wait_op(queue.addr(), 8, [&] { return queue->ctrl.atomic_op(_sync::queue::try_pop_begin, depth, &position); }); // copy data at the position to the buffer std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size); @@ -577,7 +577,7 @@ ppu_error_code cellSyncQueuePeek(vm::ptr queue, vm::ptr buf u32 position; - vm::wait_op(queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_peek_begin, depth, &position))); + vm::wait_op(queue.addr(), 8, [&] { return queue->ctrl.atomic_op(_sync::queue::try_peek_begin, depth, &position); }); // copy data at the position to the buffer std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size); @@ -659,8 +659,8 @@ ppu_error_code cellSyncQueueClear(vm::ptr queue) const u32 depth = queue->check_depth(); - vm::wait_op(queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_clear_begin_1))); - vm::wait_op(queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_clear_begin_2))); + vm::wait_op(queue.addr(), 8, [&] { return queue->ctrl.atomic_op(_sync::queue::try_clear_begin_1); }); + vm::wait_op(queue.addr(), 8, [&] { return queue->ctrl.atomic_op(_sync::queue::try_clear_begin_2); }); queue->ctrl.exchange({ 0, 0 }); diff --git a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp index 47a5986fe1..141c97e08a 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp @@ -19,8 +19,8 @@ void sys_spinlock_lock(vm::ptr> lock) { sysPrxForUser.trace("sys_spinlock_lock(lock=*0x%x)", lock); - // prx: exchange with 0xabadcafe, repeat until exchanged with 0 - vm::wait_op(lock.addr(), 4, WRAP_EXPR(!lock->exchange(0xabadcafe))); + // Try exchange with 0xabadcafe, repeat until exchanged with 0 + vm::wait_op(lock.addr(), 4, [&] { return lock->exchange(0xabadcafe) == 0; }); } s32 sys_spinlock_trylock(vm::ptr> lock) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 7658ca3577..d2e7661434 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -599,7 +599,7 @@ bool SPUThread::get_ch_value(u32 ch, u32& out) { if (!channel.try_pop(out)) { - thread_lock{*this}, thread_ctrl::wait(WRAP_EXPR(test(state & cpu_flag::stop) || channel.try_pop(out))); + thread_lock{*this}, thread_ctrl::wait([&] { return test(state & cpu_flag::stop) || channel.try_pop(out); }); return !test(state & cpu_flag::stop); } @@ -702,7 +702,7 @@ bool SPUThread::get_ch_value(u32 ch, u32& out) if (ch_event_mask & SPU_EVENT_LR) { // register waiter if polling reservation status is required - vm::wait_op(last_raddr, 128, WRAP_EXPR(get_events(true) || test(state & cpu_flag::stop))); + vm::wait_op(last_raddr, 128, [&] { return get_events(true) || test(state & cpu_flag::stop); }); } else { diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index f847681685..751235c81d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -20,7 +20,7 @@ std::shared_ptr lv2_event_queue_t::make(u32 protocol, s32 typ { auto queue = std::make_shared(protocol, type, name, ipc_key, size); - auto make_expr = WRAP_EXPR(idm::import(WRAP_EXPR(queue))); + auto make_expr = [&] { return idm::import([&] { return queue; }); }; if (ipc_key == SYS_EVENT_QUEUE_LOCAL) { diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 05dc2ea77b..c42e3209d9 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -279,7 +279,7 @@ public: template static inline std::enable_if_t::value, std::shared_ptr> make_ptr(Args&&... args) { - if (auto pair = create_id(WRAP_EXPR(std::make_shared(std::forward(args)...)))) + if (auto pair = create_id([&] { return std::make_shared(std::forward(args)...); })) { id_manager::on_init::func(static_cast(pair->second.get()), pair->second); id_manager::on_stop::func(nullptr); @@ -293,7 +293,7 @@ public: template static inline std::enable_if_t::value, u32> make(Args&&... args) { - if (auto pair = create_id(WRAP_EXPR(std::make_shared(std::forward(args)...)))) + if (auto pair = create_id([&] { return std::make_shared(std::forward(args)...); })) { id_manager::on_init::func(static_cast(pair->second.get()), pair->second); id_manager::on_stop::func(nullptr); @@ -307,7 +307,7 @@ public: template static inline u32 import_existing(const std::shared_ptr& ptr) { - if (auto pair = create_id(WRAP_EXPR(ptr))) + if (auto pair = create_id([&] { return ptr; })) { id_manager::on_init::func(static_cast(pair->second.get()), pair->second); id_manager::on_stop::func(nullptr); diff --git a/rpcs3/Emu/Memory/wait_engine.cpp b/rpcs3/Emu/Memory/wait_engine.cpp index a16ed49bf5..02144a84e6 100644 --- a/rpcs3/Emu/Memory/wait_engine.cpp +++ b/rpcs3/Emu/Memory/wait_engine.cpp @@ -49,7 +49,7 @@ namespace vm }; // Wait until thread == nullptr - waiter{this}, thread_ctrl::wait(WRAP_EXPR(!thread || test())); + waiter{this}, thread_ctrl::wait([&] { return !thread || test(); }); } bool waiter_base::try_notify() diff --git a/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp b/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp index 25f8b0faca..683c64147f 100644 --- a/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/PSP2/Modules/sceLibKernel.cpp @@ -542,7 +542,7 @@ struct psp2_event_flag final { if (!exec(task::signal, cpu.id)) { - thread_lock{cpu}, thread_ctrl::wait(WRAP_EXPR(cpu.state.test_and_reset(cpu_flag::signal))); + thread_lock{cpu}, thread_ctrl::wait([&] { return cpu.state.test_and_reset(cpu_flag::signal); }); } else { @@ -625,7 +625,7 @@ private: idm::select([&](u32 id, ARMv7Thread& cpu) { - if (cpu->lock_if(WRAP_EXPR(cpu.owner == this && pat_test(new_state.pattern, cpu.GPR[1], cpu.GPR[0])))) + if (cpu->lock_if([&] { return cpu.owner == this && pat_test(new_state.pattern, cpu.GPR[1], cpu.GPR[0]); })) { threads.emplace_back(cpu); } @@ -648,7 +648,7 @@ private: { idm::get(new_state.waiters, [&](u32 id, ARMv7Thread& cpu) { - if (cpu->lock_if(WRAP_EXPR(cpu.owner == this && pat_test(new_state.pattern, cpu.GPR[1], cpu.GPR[0])))) + if (cpu->lock_if([&] { return cpu.owner == this && pat_test(new_state.pattern, cpu.GPR[1], cpu.GPR[0]); })) { threads.emplace_back(cpu); } @@ -706,7 +706,7 @@ private: idm::select([&](u32, ARMv7Thread& cpu) { - if (cpu->lock_if(WRAP_EXPR(cpu.owner == this))) + if (cpu->lock_if([&] { return cpu.owner == this; })) { cpu.GPR[0] = error; cpu.GPR[1] = pattern; @@ -741,7 +741,10 @@ arm_error_code sceKernelCreateEventFlag(vm::cptr pName, u32 attr, u32 init auto evf = std::make_shared(pName.get_ptr(), attr, initPattern); // Try to register IPC name, only if not empty string (TODO) - if (evf->name.empty() || !psp2_event_flag::ipc::add(evf->name, WRAP_EXPR(evf))) evf->ipc_ref = 0; + if (evf->name.empty() || !psp2_event_flag::ipc::add(evf->name, [&] { return evf; })) + { + evf->ipc_ref = 0; + } // Register ID return NOT_AN_ERROR(idm::import_existing(evf)); @@ -863,7 +866,7 @@ arm_error_code sceKernelWaitEventFlag(ARMv7Thread& cpu, s32 evfId, u32 bitPatter thread_lock entry(cpu); - if (!thread_ctrl::wait_for(timeout, WRAP_EXPR(cpu.state.test_and_reset(cpu_flag::signal)))) + if (!thread_ctrl::wait_for(timeout, [&] { return cpu.state.test_and_reset(cpu_flag::signal); })) { // Timeout cleanup cpu.owner = nullptr;