Skip to content

Commit cca497a

Browse files
author
Kolkir
committed
Refactor exception throwing
1 parent 826ca61 commit cca497a

6 files changed

Lines changed: 73 additions & 115 deletions

File tree

‎include/cpptask/async.h‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,9 @@ namespace cpptask
9494
{
9595
if (!deffered)
9696
{
97-
TaskManager* manager = TaskManager::GetCurrent();
98-
if (manager != nullptr)
99-
{
100-
manager->WaitTask(*task);
101-
realFuture.wait();
102-
}
103-
else
104-
{
105-
throw Exception("Can't acquire current task manager");
106-
}
97+
auto& manager = TaskManager::GetCurrent();
98+
manager.WaitTask(*task);
99+
realFuture.wait();
107100
}
108101
else
109102
{
@@ -165,16 +158,9 @@ namespace cpptask
165158
}
166159
else if (policy == std::launch::async)
167160
{
168-
TaskManager* manager = TaskManager::GetCurrent();
169-
if (manager != nullptr)
170-
{
171-
manager->AddTask(*task);
172-
return future<typename std::result_of<Function(Args...)>::type>(std::move(task), std::move(res), false);
173-
}
174-
else
175-
{
176-
throw Exception("Can't acquire current task manager");
177-
}
161+
auto& manager = TaskManager::GetCurrent();
162+
manager.AddTask(*task);
163+
return future<typename std::result_of<Function(Args...)>::type>(std::move(task), std::move(res), false);
178164
}
179165
else
180166
{

‎include/cpptask/parallelfor.h‎

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -128,34 +128,21 @@ namespace internal
128128
template<class Iterator, class Functor>
129129
void ParallelForEach(Iterator start, Iterator end, Functor functor)
130130
{
131-
TaskManager* manager = TaskManager::GetCurrent();
132-
if(manager != nullptr)
133-
{
134-
typedef std::vector<Range<Iterator> > RANGES;
135-
RANGES ranges = SplitRange(start, end, manager->GetThreadsNum());
136-
internal::ParallelForBase<Functor, RANGES, internal::ForEachTask<Range<Iterator>,Functor> >(ranges, functor, *manager);
137-
}
138-
else
139-
{
140-
throw Exception("Can't acquire current task manager");
141-
}
131+
auto& manager = TaskManager::GetCurrent();
132+
typedef std::vector<Range<Iterator> > RANGES;
133+
RANGES ranges = SplitRange(start, end, manager.GetThreadsNum());
134+
internal::ParallelForBase<Functor, RANGES, internal::ForEachTask<Range<Iterator>,Functor> >(ranges, functor, manager);
142135
}
143136

144137
template<class Num, class Functor>
145138
void ParallelFor(Num start, Num end, Functor functor)
146139
{
147140
assert(end >= start);
148-
TaskManager* manager = TaskManager::GetCurrent();
149-
if(manager != nullptr)
150-
{
151-
typedef std::vector<Range<Num> > RANGES;
152-
RANGES ranges = SplitNumRange(start, end, manager->GetThreadsNum());
153-
internal::ParallelForBase<Functor, RANGES, internal::ForTask<Range<Num>,Functor> >(ranges, functor, *manager);
154-
}
155-
else
156-
{
157-
throw Exception("Can't acquire current task manager");
158-
}
141+
auto& manager = TaskManager::GetCurrent();
142+
143+
typedef std::vector<Range<Num> > RANGES;
144+
RANGES ranges = SplitNumRange(start, end, manager.GetThreadsNum());
145+
internal::ParallelForBase<Functor, RANGES, internal::ForTask<Range<Num>,Functor> >(ranges, functor, manager);
159146
}
160147

161148

‎include/cpptask/parallelinvoke.h‎

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,34 +57,28 @@ namespace internal
5757
template<class Functor1, class Functor2>
5858
inline void ParallelInvoke(Functor1 func1, Functor2 func2)
5959
{
60-
TaskManager* manager = TaskManager::GetCurrent();
61-
if (manager != nullptr)
62-
{
63-
typedef internal::InvokeTask<Functor1> TaskType1;
60+
auto& manager = TaskManager::GetCurrent();
6461

65-
TaskType1 task1(func1);
66-
manager->AddTask(task1);
62+
typedef internal::InvokeTask<Functor1> TaskType1;
6763

68-
typedef internal::InvokeTask<Functor2> TaskType2;
69-
70-
TaskType2 task2(func2);
71-
manager->AddTask(task2);
64+
TaskType1 task1(func1);
65+
manager.AddTask(task1);
7266

73-
manager->WaitTask(task1);
74-
manager->WaitTask(task2);
67+
typedef internal::InvokeTask<Functor2> TaskType2;
7568

76-
if (task1.GetLastException() != nullptr)
77-
{
78-
std::rethrow_exception(task1.GetLastException());
79-
}
80-
if (task2.GetLastException() != nullptr)
81-
{
82-
std::rethrow_exception(task2.GetLastException());
83-
}
69+
TaskType2 task2(func2);
70+
manager.AddTask(task2);
71+
72+
manager.WaitTask(task1);
73+
manager.WaitTask(task2);
74+
75+
if (task1.GetLastException() != nullptr)
76+
{
77+
std::rethrow_exception(task1.GetLastException());
8478
}
85-
else
79+
if (task2.GetLastException() != nullptr)
8680
{
87-
throw Exception("Can't acquire current task manager");
81+
std::rethrow_exception(task2.GetLastException());
8882
}
8983
}
9084

‎include/cpptask/parallelreduce.h‎

Lines changed: 34 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -78,46 +78,40 @@ namespace internal
7878

7979
typename std::aligned_storage<sizeof(Functor), _CPP_TASK_CACHE_LINE_SIZE_>::type functors[splitCount];
8080

81-
TaskManager* manager = TaskManager::GetCurrent();
82-
if (manager != nullptr)
81+
auto& manager = TaskManager::GetCurrent();
82+
83+
for (size_t i = 0; i != splitCount; ++i)
8384
{
84-
for (size_t i = 0; i != splitCount; ++i)
85-
{
86-
new(functors + i)Functor(functor, SplitMark());
85+
new(functors + i)Functor(functor, SplitMark());
8786

88-
TASK* ptr = new TASK(ranges[i],
89-
*reinterpret_cast<Functor*>(functors + i),
90-
myDepth - 1);
87+
TASK* ptr = new TASK(ranges[i],
88+
*reinterpret_cast<Functor*>(functors + i),
89+
myDepth - 1);
9190

92-
tasks[i].reset(ptr);
93-
manager->AddTask(*tasks[i]);
94-
};
91+
tasks[i].reset(ptr);
92+
manager.AddTask(*tasks[i]);
93+
};
9594

96-
for (size_t i = 0; i != splitCount; ++i)
97-
{
98-
manager->WaitTask(*tasks[i]);
99-
};
95+
for (size_t i = 0; i != splitCount; ++i)
96+
{
97+
manager.WaitTask(*tasks[i]);
98+
};
10099

101-
//check exceptions in child tasks
102-
for (size_t i = 0; i != splitCount; ++i)
103-
{
104-
if (tasks[i]->GetLastException() != nullptr)
105-
{
106-
std::rethrow_exception(tasks[i]->GetLastException());
107-
}
108-
};
109-
110-
//Join
111-
for (size_t i = 1; i != splitCount; ++i)
100+
//check exceptions in child tasks
101+
for (size_t i = 0; i != splitCount; ++i)
102+
{
103+
if (tasks[i]->GetLastException() != nullptr)
112104
{
113-
tasks[0]->Join(*tasks[i]);
105+
std::rethrow_exception(tasks[i]->GetLastException());
114106
}
115-
Join(*tasks[0]);
116-
}
117-
else
107+
};
108+
109+
//Join
110+
for (size_t i = 1; i != splitCount; ++i)
118111
{
119-
throw Exception("Can't acquire current task manager");
112+
tasks[0]->Join(*tasks[i]);
120113
}
114+
Join(*tasks[0]);
121115
}
122116
else
123117
{
@@ -135,22 +129,16 @@ namespace internal
135129
template<class Iterator, class Functor>
136130
inline void ParallelReduce(Iterator start, Iterator end, Functor& functor, size_t maxDepth = 5)
137131
{
138-
TaskManager* manager = TaskManager::GetCurrent();
139-
if (manager != nullptr)
140-
{
141-
typedef Range<Iterator> RANGE;
142-
typedef internal::ReduceTask<RANGE, Functor> TASK;
143-
TASK task(RANGE(start, end), functor, maxDepth);
144-
manager->AddTask(task);
145-
manager->WaitTask(task);
146-
if (task.GetLastException() != nullptr)
147-
{
148-
std::rethrow_exception(task.GetLastException());
149-
}
150-
}
151-
else
132+
auto& manager = TaskManager::GetCurrent();
133+
134+
typedef Range<Iterator> RANGE;
135+
typedef internal::ReduceTask<RANGE, Functor> TASK;
136+
TASK task(RANGE(start, end), functor, maxDepth);
137+
manager.AddTask(task);
138+
manager.WaitTask(task);
139+
if (task.GetLastException() != nullptr)
152140
{
153-
throw Exception("Can't acquire current task manager");
141+
std::rethrow_exception(task.GetLastException());
154142
}
155143
}
156144

‎include/cpptask/taskmanager.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class TaskManager
6666

6767
Task* GetTask();
6868

69-
static TaskManager* GetCurrent();
69+
static TaskManager& GetCurrent();
7070

7171
void RegisterInTLS();
7272

‎include/cpptask/taskmanagerlimpl.h‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,17 @@ inline Task* TaskManager::GetTask()
9999
return res;
100100
}
101101

102-
inline TaskManager* TaskManager::GetCurrent()
102+
inline TaskManager& TaskManager::GetCurrent()
103103
{
104104
void* pvalue = GetManagerKey().GetValue();
105-
if (pvalue != 0)
105+
if (pvalue != nullptr)
106106
{
107-
return reinterpret_cast<TaskManager*>(pvalue);
107+
return *reinterpret_cast<TaskManager*>(pvalue);
108+
}
109+
else
110+
{
111+
throw Exception("Can't acquire current task manager");
108112
}
109-
return 0;
110113
}
111114

112115
inline void TaskManager::RegisterInTLS()

0 commit comments

Comments
 (0)