diff options
author | Tom Stellard <[email protected]> | 2015-05-07 13:57:14 +0000 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2015-05-11 18:52:18 +0000 |
commit | f546902d9597429713c83e2caf6b69856bd7ba4d (patch) | |
tree | 82ec75df7964205cafaf40ac1a048ff5b4cb9b3a | |
parent | 73f4010082cf0fc2fe34c59e2eb5801eed10762b (diff) |
clover: Add a mutex to guard queue::queued_events
This fixes a potential crash where on a sequence like this:
Thread 0: Check if queue is not empty.
Thread 1: Remove item from queue, making it empty.
Thread 0: Do something assuming queue is not empty.
CC: 10.5 <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/clover/core/queue.cpp | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/queue.hpp | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/clover/core/queue.cpp b/src/gallium/state_trackers/clover/core/queue.cpp index 24f9326662d..87f9dcc6476 100644 --- a/src/gallium/state_trackers/clover/core/queue.cpp +++ b/src/gallium/state_trackers/clover/core/queue.cpp @@ -44,6 +44,7 @@ command_queue::flush() { pipe_screen *screen = device().pipe; pipe_fence_handle *fence = NULL; + std::lock_guard<std::mutex> lock(queued_events_mutex); if (!queued_events.empty()) { pipe->flush(pipe, &fence, 0); @@ -69,6 +70,7 @@ command_queue::profiling_enabled() const { void command_queue::sequence(hard_event &ev) { + std::lock_guard<std::mutex> lock(queued_events_mutex); if (!queued_events.empty()) queued_events.back()().chain(ev); diff --git a/src/gallium/state_trackers/clover/core/queue.hpp b/src/gallium/state_trackers/clover/core/queue.hpp index b7166e685b7..bddb86c0e4c 100644 --- a/src/gallium/state_trackers/clover/core/queue.hpp +++ b/src/gallium/state_trackers/clover/core/queue.hpp @@ -24,6 +24,7 @@ #define CLOVER_CORE_QUEUE_HPP #include <deque> +#include <mutex> #include "core/object.hpp" #include "core/context.hpp" @@ -69,6 +70,7 @@ namespace clover { cl_command_queue_properties props; pipe_context *pipe; + std::mutex queued_events_mutex; std::deque<intrusive_ref<hard_event>> queued_events; }; } |