This mutex effectively prevents an event's chain or wait_count from being updated while it is in the process of triggering. Otherwise it may be possible to add to an event's chain after it has been triggered, which causes the chained event to never be triggered. --- src/gallium/state_trackers/clover/core/event.cpp | 3 +++ src/gallium/state_trackers/clover/core/event.hpp | 1 + 2 files changed, 4 insertions(+)
diff --git a/src/gallium/state_trackers/clover/core/event.cpp b/src/gallium/state_trackers/clover/core/event.cpp index da227bb..646fd38 100644 --- a/src/gallium/state_trackers/clover/core/event.cpp +++ b/src/gallium/state_trackers/clover/core/event.cpp @@ -38,6 +38,7 @@ event::~event() { void event::trigger() { + std::lock_guard<std::mutex> lock(trigger_mutex); if (!--wait_count) { signalled_cv.notify_all(); action_ok(*this); @@ -54,6 +55,7 @@ event::abort(cl_int status) { _status = status; action_fail(*this); + std::lock_guard<std::mutex> lock(trigger_mutex); while (!_chain.empty()) { _chain.back()().abort(status); _chain.pop_back(); @@ -67,6 +69,7 @@ event::signalled() const { void event::chain(event &ev) { + std::lock_guard<std::mutex> lock(trigger_mutex); if (!signalled()) { ev.wait_count++; _chain.push_back(ev); diff --git a/src/gallium/state_trackers/clover/core/event.hpp b/src/gallium/state_trackers/clover/core/event.hpp index dffafb9..a64fbba 100644 --- a/src/gallium/state_trackers/clover/core/event.hpp +++ b/src/gallium/state_trackers/clover/core/event.hpp @@ -90,6 +90,7 @@ namespace clover { std::vector<intrusive_ref<event>> _chain; std::condition_variable signalled_cv; std::mutex signalled_mutex; + std::mutex trigger_mutex; }; /// -- 2.0.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev