5
5
namespace fly {
6
6
7
7
// ==================================================================================================
8
- TaskRunner::TaskRunner (std::weak_ptr <TaskManager> weak_task_manager ) noexcept :
9
- m_weak_task_manager (std::move(weak_task_manager) )
8
+ TaskRunner::TaskRunner (const std::shared_ptr <TaskManager> &task_manager ) noexcept :
9
+ m_weak_task_manager (task_manager )
10
10
{
11
11
}
12
12
@@ -46,8 +46,25 @@ void TaskRunner::execute(TaskLocation &&location, Task &&task)
46
46
}
47
47
48
48
// ==================================================================================================
49
- ParallelTaskRunner::ParallelTaskRunner (std::weak_ptr<TaskManager> weak_task_manager) noexcept :
50
- TaskRunner (std::move(weak_task_manager))
49
+ std::shared_ptr<ParallelTaskRunner>
50
+ ParallelTaskRunner::create (const std::shared_ptr<TaskManager> &task_manager)
51
+ {
52
+ // ParallelTaskRunner has a private constructor, thus cannot be used with std::make_shared. This
53
+ // class is used to expose the private constructor locally.
54
+ struct ParallelTaskRunnerImpl final : public ParallelTaskRunner
55
+ {
56
+ explicit ParallelTaskRunnerImpl (const std::shared_ptr<TaskManager> &task_manager) noexcept :
57
+ ParallelTaskRunner(task_manager)
58
+ {
59
+ }
60
+ };
61
+
62
+ return std::make_shared<ParallelTaskRunnerImpl>(task_manager);
63
+ }
64
+
65
+ // ==================================================================================================
66
+ ParallelTaskRunner::ParallelTaskRunner (const std::shared_ptr<TaskManager> &task_manager) noexcept :
67
+ TaskRunner (task_manager)
51
68
{
52
69
}
53
70
@@ -63,8 +80,27 @@ void ParallelTaskRunner::task_complete(TaskLocation &&)
63
80
}
64
81
65
82
// ==================================================================================================
66
- SequencedTaskRunner::SequencedTaskRunner (std::weak_ptr<TaskManager> weak_task_manager) noexcept :
67
- TaskRunner (std::move(weak_task_manager))
83
+ std::shared_ptr<SequencedTaskRunner>
84
+ SequencedTaskRunner::create (const std::shared_ptr<TaskManager> &task_manager)
85
+ {
86
+ // SequencedTaskRunner has a private constructor, thus cannot be used with std::make_shared.
87
+ // This class is used to expose the private constructor locally.
88
+ struct SequencedTaskRunnerImpl final : public SequencedTaskRunner
89
+ {
90
+ explicit SequencedTaskRunnerImpl (const std::shared_ptr<TaskManager> &task_manager) noexcept
91
+ :
92
+ SequencedTaskRunner(task_manager)
93
+ {
94
+ }
95
+ };
96
+
97
+ return std::make_shared<SequencedTaskRunnerImpl>(task_manager);
98
+ }
99
+
100
+ // ==================================================================================================
101
+ SequencedTaskRunner::SequencedTaskRunner (const std::shared_ptr<TaskManager> &task_manager) noexcept
102
+ :
103
+ TaskRunner (task_manager)
68
104
{
69
105
}
70
106
0 commit comments