diff --git a/src/xrt/drivers/steamvr_lh/interfaces/context.hpp b/src/xrt/drivers/steamvr_lh/interfaces/context.hpp index 54cb07ae4..9429097e8 100644 --- a/src/xrt/drivers/steamvr_lh/interfaces/context.hpp +++ b/src/xrt/drivers/steamvr_lh/interfaces/context.hpp @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include @@ -73,6 +74,7 @@ private: std::deque events; size_t events_tail{0}; std::mutex event_queue_mut; + std::condition_variable event_popped; Device * prop_container_to_device(vr::PropertyContainerHandle_t handle); diff --git a/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp b/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp index aad976c27..ca985df79 100644 --- a/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp +++ b/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp @@ -465,7 +465,10 @@ Context::add_haptic_event(vr::VREvent_HapticVibration_t event, const size_t old_ d.hapticVibration = event; e.data = d; - std::lock_guard lk(event_queue_mut); + std::unique_lock lk(event_queue_mut); + while (events.size() >= 120) { // avoid unbounded allocation if misbehaving apps send too many events at once + event_popped.wait(lk); + } const size_t old_event_index = old_event_handle - events_tail; if (old_event_index < size_t(events.size())) { vr::VREvent_t *const old_event = &events[old_event_index].inner; @@ -491,6 +494,7 @@ Context::PollNextEvent(vr::VREvent_t *pEvent, uint32_t uncbVREvent) if (e.inner.eventType == vr::EVREventType::VREvent_None) { continue; } + event_popped.notify_all(); *pEvent = e.inner; using float_sec = std::chrono::duration; float_sec event_age = std::chrono::steady_clock::now() - e.insert_time;