mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
named_thread: use concepts, improve constructors
Better default thread name detection.
This commit is contained in:
parent
67649d7976
commit
61450335a5
1 changed files with 14 additions and 13 deletions
|
@ -42,7 +42,7 @@ class named_thread;
|
||||||
|
|
||||||
class thread_base;
|
class thread_base;
|
||||||
|
|
||||||
template <typename Ctx, typename X = void, typename... Args>
|
template <typename Ctx, typename... Args>
|
||||||
struct result_storage
|
struct result_storage
|
||||||
{
|
{
|
||||||
static constexpr bool empty = true;
|
static constexpr bool empty = true;
|
||||||
|
@ -50,8 +50,8 @@ struct result_storage
|
||||||
using type = void;
|
using type = void;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Ctx, typename... Args>
|
template <typename Ctx, typename... Args> requires (!std::is_void_v<std::invoke_result_t<Ctx, Args&&...>>)
|
||||||
struct result_storage<Ctx, std::enable_if_t<!std::is_void_v<std::invoke_result_t<Ctx, Args&&...>>>, Args...>
|
struct result_storage<Ctx, Args...>
|
||||||
{
|
{
|
||||||
using T = std::invoke_result_t<Ctx, Args&&...>;
|
using T = std::invoke_result_t<Ctx, Args&&...>;
|
||||||
|
|
||||||
|
@ -84,6 +84,12 @@ struct result_storage<Ctx, std::enable_if_t<!std::is_void_v<std::invoke_result_t
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
concept NamedThreadName = requires (T& t)
|
||||||
|
{
|
||||||
|
std::string_view(t.thread_name);
|
||||||
|
};
|
||||||
|
|
||||||
// Base class for task queue (linked list)
|
// Base class for task queue (linked list)
|
||||||
class thread_future
|
class thread_future
|
||||||
{
|
{
|
||||||
|
@ -110,12 +116,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename = void>
|
|
||||||
struct thread_thread_name : std::bool_constant<false> {};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct thread_thread_name<T, std::void_t<decltype(named_thread<T>::thread_name)>> : std::bool_constant<true> {};
|
|
||||||
|
|
||||||
// Thread base class
|
// Thread base class
|
||||||
class thread_base
|
class thread_base
|
||||||
{
|
{
|
||||||
|
@ -479,16 +479,17 @@ class named_thread final : public Context, result_storage<Context>, thread_base
|
||||||
friend class thread_ctrl;
|
friend class thread_ctrl;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Default constructor
|
// Forwarding constructor with default name (also potentially the default constructor)
|
||||||
named_thread() requires (std::is_default_constructible_v<Context>) && (thread_thread_name<Context>::value)
|
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (NamedThreadName<Context>)
|
||||||
: Context()
|
named_thread(Args&&... args)
|
||||||
|
: Context(std::forward<Args>(args)...)
|
||||||
, thread(trampoline, Context::thread_name)
|
, thread(trampoline, Context::thread_name)
|
||||||
{
|
{
|
||||||
thread::start();
|
thread::start();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal forwarding constructor
|
// Normal forwarding constructor
|
||||||
template <typename... Args, typename = std::enable_if_t<std::is_constructible_v<Context, Args&&...>>>
|
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (!NamedThreadName<Context>)
|
||||||
named_thread(std::string_view name, Args&&... args)
|
named_thread(std::string_view name, Args&&... args)
|
||||||
: Context(std::forward<Args>(args)...)
|
: Context(std::forward<Args>(args)...)
|
||||||
, thread(trampoline, name)
|
, thread(trampoline, name)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue