Skip to content
Snippets Groups Projects
Commit f25af531 authored by Francisco Jerez's avatar Francisco Jerez Committed by Emil Velikov
Browse files

clover: Refactor event::trigger and ::abort to prevent deadlock and reentrancy issues.


Refactor ::trigger and ::abort to split out the operations that access
concurrently modified data members and require locking from the
recursive and possibly re-entrant part of these methods.  This will
avoid some deadlock situations when locking is implemented.

Tested-by: default avatarTom Stellard <thomas.stellard@amd.com>
CC: 10.5 <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 2232b929)
parent 1353ba53
No related branches found
No related tags found
No related merge requests found
......@@ -36,28 +36,47 @@ event::event(clover::context &ctx, const ref_vector<event> &deps,
event::~event() {
}
std::vector<intrusive_ref<event>>
event::trigger_self() {
std::vector<intrusive_ref<event>> evs;
if (!--wait_count)
std::swap(_chain, evs);
return evs;
}
void
event::trigger() {
if (!--wait_count) {
cv.notify_all();
action_ok(*this);
auto evs = trigger_self();
while (!_chain.empty()) {
_chain.back()().trigger();
_chain.pop_back();
}
if (signalled()) {
action_ok(*this);
cv.notify_all();
}
for (event &ev : evs)
ev.trigger();
}
std::vector<intrusive_ref<event>>
event::abort_self(cl_int status) {
std::vector<intrusive_ref<event>> evs;
_status = status;
std::swap(_chain, evs);
return evs;
}
void
event::abort(cl_int status) {
_status = status;
auto evs = abort_self(status);
action_fail(*this);
while (!_chain.empty()) {
_chain.back()().abort(status);
_chain.pop_back();
}
for (event &ev : evs)
ev.abort(status);
}
bool
......
......@@ -80,6 +80,9 @@ namespace clover {
std::vector<intrusive_ref<event>> deps;
private:
std::vector<intrusive_ref<event>> trigger_self();
std::vector<intrusive_ref<event>> abort_self(cl_int status);
unsigned wait_count;
action action_ok;
action action_fail;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment