Simplify named_thread construction

This commit is contained in:
Eladash 2021-05-01 09:34:52 +03:00 committed by Ivan
parent b8477a470f
commit daa53b77cf
12 changed files with 70 additions and 38 deletions

View File

@ -2316,9 +2316,9 @@ std::string thread_ctrl::get_name_cached()
return *name_cache; return *name_cache;
} }
thread_base::thread_base(native_entry entry, std::string_view name) thread_base::thread_base(native_entry entry, std::string name)
: entry_point(entry) : entry_point(entry)
, m_tname(make_single<std::string>(name)) , m_tname(make_single_value(std::move(name)))
{ {
} }

View File

@ -85,9 +85,9 @@ struct result_storage<Ctx, Args...>
}; };
template <typename T> template <typename T>
concept NamedThreadName = requires (T& t) concept NamedThreadName = requires (const T& t)
{ {
std::string_view(t.thread_name); std::string(t.thread_name);
}; };
// Base class for task queue (linked list) // Base class for task queue (linked list)
@ -166,7 +166,7 @@ private:
friend class named_thread; friend class named_thread;
protected: protected:
thread_base(native_entry, std::string_view name); thread_base(native_entry, std::string name);
~thread_base(); ~thread_base();
@ -483,16 +483,16 @@ public:
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (NamedThreadName<Context>) template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (NamedThreadName<Context>)
named_thread(Args&&... args) named_thread(Args&&... args)
: Context(std::forward<Args>(args)...) : Context(std::forward<Args>(args)...)
, thread(trampoline, Context::thread_name) , thread(trampoline, std::string(Context::thread_name))
{ {
thread::start(); thread::start();
} }
// Normal forwarding constructor // Normal forwarding constructor
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (!NamedThreadName<Context>) template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>)
named_thread(std::string_view name, Args&&... args) named_thread(std::string name, Args&&... args)
: Context(std::forward<Args>(args)...) : Context(std::forward<Args>(args)...)
, thread(trampoline, name) , thread(trampoline, std::move(name))
{ {
thread::start(); thread::start();
} }
@ -500,7 +500,7 @@ public:
// Lambda constructor, also the implicit deduction guide candidate // Lambda constructor, also the implicit deduction guide candidate
named_thread(std::string_view name, Context&& f) named_thread(std::string_view name, Context&& f)
: Context(std::forward<Context>(f)) : Context(std::forward<Context>(f))
, thread(trampoline, name) , thread(trampoline, std::string(name))
{ {
thread::start(); thread::start();
} }

View File

@ -821,7 +821,7 @@ void try_spawn_ppu_if_exclusive_program(const ppu_module& m)
.stack_size = SYS_PROCESS_PARAM_STACK_SIZE_MAX, .stack_size = SYS_PROCESS_PARAM_STACK_SIZE_MAX,
}; };
auto ppu = idm::make_ptr<named_thread<ppu_thread>>("PPU[0x1000000] Thread (test_thread)", p, "test_thread", 0); auto ppu = idm::make_ptr<named_thread<ppu_thread>>(p, "test_thread", 0);
ppu->cia = m.funcs[0].addr; ppu->cia = m.funcs[0].addr;
@ -1694,7 +1694,7 @@ bool ppu_load_exec(const ppu_exec_object& elf)
p.stack_addr = vm::cast(vm::alloc(primary_stacksize, vm::stack, 4096)); p.stack_addr = vm::cast(vm::alloc(primary_stacksize, vm::stack, 4096));
p.stack_size = primary_stacksize; p.stack_size = primary_stacksize;
auto ppu = idm::make_ptr<named_thread<ppu_thread>>("PPU[0x1000000] main_thread ", p, "main_thread", primary_prio, 1); auto ppu = idm::make_ptr<named_thread<ppu_thread>>(p, "main_thread", primary_prio, 1);
// Write initial data (exitspawn) // Write initial data (exitspawn)
if (!Emu.data.empty()) if (!Emu.data.empty())

View File

@ -1133,6 +1133,18 @@ ppu_thread::ppu_thread(const ppu_thread_params& param, std::string_view name, u3
} }
} }
ppu_thread::thread_name_t::operator std::string() const
{
std::string thread_name = fmt::format("PPU[0x%x]", _this->id);
if (const std::string name = *_this->ppu_tname.load(); !name.empty())
{
fmt::append(thread_name, " %s", name);
}
return thread_name;
}
void ppu_thread::cmd_push(cmd64 cmd) void ppu_thread::cmd_push(cmd64 cmd)
{ {
// Reserve queue space // Reserve queue space

View File

@ -282,6 +282,14 @@ public:
u32 dbg_step_pc = 0; u32 dbg_step_pc = 0;
// For named_thread ctor
const struct thread_name_t
{
const ppu_thread* _this;
operator std::string() const;
} thread_name{ this };
be_t<u64>* get_stack_arg(s32 i, u64 align = alignof(u64)); be_t<u64>* get_stack_arg(s32 i, u64 align = alignof(u64));
void exec_task(); void exec_task();
void fast_call(u32 addr, u32 rtoc); void fast_call(u32 addr, u32 rtoc);

View File

@ -321,7 +321,7 @@ void spu_load_exec(const spu_exec_object& elf)
{ {
spu_thread::g_raw_spu_ctr++; spu_thread::g_raw_spu_ctr++;
auto spu = idm::make_ptr<named_thread<spu_thread>>("TEST_SPU", nullptr, 0, "", 0); auto spu = idm::make_ptr<named_thread<spu_thread>>(nullptr, 0, "test_spu", 0);
for (const auto& prog : elf.progs) for (const auto& prog : elf.progs)
{ {

View File

@ -4793,6 +4793,27 @@ spu_function_logger::spu_function_logger(spu_thread& spu, const char* func)
spu.start_time = get_system_time(); spu.start_time = get_system_time();
} }
spu_thread::thread_name_t::operator std::string() const
{
std::string full_name = fmt::format("%s[0x%07x]", [](spu_type type) -> std::string_view
{
switch (type)
{
case spu_type::threaded: return "SPU"sv;
case spu_type::raw: return "RawSPU"sv;
case spu_type::isolated: return "Iso"sv;
default: fmt::throw_exception("Unreachable");
}
}(_this->get_type()), _this->lv2_id);
if (const std::string name = *_this->spu_tname.load(); !name.empty())
{
fmt::append(full_name, " %s", name);
}
return full_name;
}
template <> template <>
void fmt_class_string<spu_channel>::format(std::string& out, u64 arg) void fmt_class_string<spu_channel>::format(std::string& out, u64 arg)
{ {

View File

@ -850,6 +850,14 @@ public:
return -1; return -1;
} }
// For named_thread ctor
const struct thread_name_t
{
const spu_thread* _this;
operator std::string() const;
} thread_name{ this };
}; };
class spu_function_logger class spu_function_logger

View File

@ -459,18 +459,6 @@ error_code _sys_ppu_thread_create(ppu_thread& ppu, vm::ptr<u64> thread_id, vm::p
const u32 tid = idm::import<named_thread<ppu_thread>>([&]() const u32 tid = idm::import<named_thread<ppu_thread>>([&]()
{ {
const u32 tid = idm::last_id();
std::string full_name = fmt::format("PPU[0x%x] ", tid);
if (threadname)
{
if (!ppu_name.empty())
{
fmt::append(full_name, "%s ", ppu_name);
}
}
ppu_thread_params p; ppu_thread_params p;
p.stack_addr = stack_base; p.stack_addr = stack_base;
p.stack_size = stack_size; p.stack_size = stack_size;
@ -479,7 +467,7 @@ error_code _sys_ppu_thread_create(ppu_thread& ppu, vm::ptr<u64> thread_id, vm::p
p.arg0 = arg; p.arg0 = arg;
p.arg1 = unk; p.arg1 = unk;
return std::make_shared<named_thread<ppu_thread>>(full_name, p, ppu_name, prio, 1 - static_cast<int>(flags & 3)); return std::make_shared<named_thread<ppu_thread>>(p, ppu_name, prio, 1 - static_cast<int>(flags & 3));
}); });
if (!tid) if (!tid)

View File

@ -408,14 +408,7 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
ensure(idm::import<named_thread<spu_thread>>([&]() ensure(idm::import<named_thread<spu_thread>>([&]()
{ {
std::string full_name = fmt::format("SPU[0x%07x] ", tid); const auto spu = std::make_shared<named_thread<spu_thread>>(group.get(), spu_num, thread_name, tid, false, option);
if (!thread_name.empty())
{
fmt::append(full_name, "%s ", thread_name);
}
const auto spu = std::make_shared<named_thread<spu_thread>>(full_name, group.get(), spu_num, thread_name, tid, false, option);
group->threads[inited] = spu; group->threads[inited] = spu;
group->threads_map[spu_num] = static_cast<s8>(inited); group->threads_map[spu_num] = static_cast<s8>(inited);
return spu; return spu;
@ -1849,7 +1842,7 @@ error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> at
index = 0; index = 0;
} }
const u32 tid = idm::make<named_thread<spu_thread>>(fmt::format("RawSPU[0x%x] ", index), nullptr, index, "", index); const u32 tid = idm::make<named_thread<spu_thread>>(nullptr, index, "", index);
spu_thread::g_raw_spu_id[index] = (ensure(tid)); spu_thread::g_raw_spu_id[index] = (ensure(tid));
@ -1897,7 +1890,7 @@ error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<voi
const u32 ls_addr = RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index; const u32 ls_addr = RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index;
const auto thread = idm::make_ptr<named_thread<spu_thread>>(fmt::format("IsoSPU[0x%x] ", index), nullptr, index, "", index, true); const auto thread = idm::make_ptr<named_thread<spu_thread>>(nullptr, index, "", index, true);
thread->gpr[3] = v128::from64(0, arg1); thread->gpr[3] = v128::from64(0, arg1);
thread->gpr[4] = v128::from64(0, arg2); thread->gpr[4] = v128::from64(0, arg2);

View File

@ -411,7 +411,7 @@ bool Emulator::BootRsxCapture(const std::string& path)
GetCallbacks().on_run(false); GetCallbacks().on_run(false);
m_state = system_state::running; m_state = system_state::running;
auto replay_thr = g_fxo->init<named_thread<rsx::rsx_replay_thread>>("RSX Replay"sv, std::move(frame)); auto replay_thr = g_fxo->init<named_thread<rsx::rsx_replay_thread>>("RSX Replay", std::move(frame));
replay_thr->state -= cpu_flag::stop; replay_thr->state -= cpu_flag::stop;
replay_thr->state.notify_one(cpu_flag::stop); replay_thr->state.notify_one(cpu_flag::stop);

View File

@ -674,7 +674,9 @@ void debugger_frame::UpdateUnitList()
if (emu_state == system_state::stopped) return; if (emu_state == system_state::stopped) return;
const QVariant var_cpu = QVariant::fromValue<std::pair<cpu_thread*, u32>>(std::make_pair(&cpu, id)); const QVariant var_cpu = QVariant::fromValue<std::pair<cpu_thread*, u32>>(std::make_pair(&cpu, id));
m_choice_units->addItem(qstr(id >> 24 == 0x55 ? "RSX[0x55555555]" : cpu.get_name()), var_cpu);
// Space at the end is to pad a gap on the right
m_choice_units->addItem(qstr((id >> 24 == 0x55 ? "RSX[0x55555555]" : cpu.get_name()) + ' '), var_cpu);
if (!reselected && old_cpu == var_cpu) if (!reselected && old_cpu == var_cpu)
{ {