Wayland에서 글로벌 제거 경주 문제 해결하기
Wayland의 글로벌 객체 관리 문제는 특히 wl_output(출력 장치) 글로벌 객체의 동적 추가 및 제거 과정에서 발생하는 경쟁 상태(race condition)로 인해 클라이언트 애플리케이션이 충돌하는 문제를 다룹니다.
첫 번째 시도는 글로벌 객체 제거 시점을 클라이언트의 바인딩 요청 처리 후로 미루기 위해 타이머 기반 지연 삭제 방식을 도입했으나, 시스템이 절전 모드에서 깨어날 때 시간 동기화 문제로 완전한 해결이 어려웠습니다.
두 번째 시도에서는 wl_fixes 인터페이스를 활용하여 클라이언트가 글로벌 객체 제거 이벤트에 대해 명시적으로 ack(확인 응답)을 보내도록 하여, 모든 클라이언트가 제거 사실을 인지한 후에만 안전하게 글로벌 객체를 파괴할 수 있도록 개선하였습니다.
이 변경으로 클라이언트는 wl_registry.global_remove 이벤트 수신 시 wl_fixes.ack_global_remove 요청을 보내야 하며, 컴포지터는 이를 처리해 글로벌 객체를 안전하게 제거할 수 있습니다.
결과적으로, 이 개선책은 Wayland 프로토콜의 핵심 결함을 보완하여 출력 장치 관련 충돌을 줄이고 세션 안정성을 높이는 데 기여할 것으로 기대됩니다.