Georg commited on
Commit ·
8dfd85d
1
Parent(s): 2a49683
Enhance overlay camera state management in mujoco_server.py
Browse files- Added logic to store a reference to the old renderer before updating the overlay camera state, preventing race conditions.
- Updated the state management to ensure the old renderer is closed only after the new state is set, mitigating use-after-free issues.
- Implemented error handling when closing the old renderer to improve robustness.
- mujoco_server.py +11 -2
mujoco_server.py
CHANGED
|
@@ -2022,15 +2022,24 @@ def add_camera():
|
|
| 2022 |
_store_dynamic_camera_config(robot_type, scene_name, config)
|
| 2023 |
|
| 2024 |
state_payload = _build_overlay_camera_state(config, create_renderer=False)
|
|
|
|
|
|
|
|
|
|
| 2025 |
with overlay_camera_lock:
|
| 2026 |
if config["name"] in overlay_camera_states:
|
| 2027 |
old_renderer = overlay_camera_states[config["name"]].get("renderer")
|
| 2028 |
-
|
| 2029 |
-
old_renderer.close()
|
| 2030 |
overlay_camera_states[config["name"]] = state_payload
|
| 2031 |
with overlay_frame_lock:
|
| 2032 |
overlay_frames[config["name"]] = None
|
| 2033 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2034 |
broadcast_camera_event(
|
| 2035 |
"added",
|
| 2036 |
camera_payload,
|
|
|
|
| 2022 |
_store_dynamic_camera_config(robot_type, scene_name, config)
|
| 2023 |
|
| 2024 |
state_payload = _build_overlay_camera_state(config, create_renderer=False)
|
| 2025 |
+
|
| 2026 |
+
# Store reference to old renderer to close after state update (prevents race condition)
|
| 2027 |
+
old_renderer = None
|
| 2028 |
with overlay_camera_lock:
|
| 2029 |
if config["name"] in overlay_camera_states:
|
| 2030 |
old_renderer = overlay_camera_states[config["name"]].get("renderer")
|
| 2031 |
+
# Update state first before closing old renderer to prevent use-after-free
|
|
|
|
| 2032 |
overlay_camera_states[config["name"]] = state_payload
|
| 2033 |
with overlay_frame_lock:
|
| 2034 |
overlay_frames[config["name"]] = None
|
| 2035 |
|
| 2036 |
+
# Close old renderer after state is updated (prevents simulation loop from accessing freed renderer)
|
| 2037 |
+
if old_renderer:
|
| 2038 |
+
try:
|
| 2039 |
+
old_renderer.close()
|
| 2040 |
+
except Exception:
|
| 2041 |
+
pass
|
| 2042 |
+
|
| 2043 |
broadcast_camera_event(
|
| 2044 |
"added",
|
| 2045 |
camera_payload,
|