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.

Files changed (1) hide show
  1. 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
- if old_renderer:
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,