@@ -491,6 +491,43 @@ impl InnerBackend {
491491 }
492492 }
493493
494+ fn destroy_object_inner ( & self , guard : & mut MutexGuard < ConnectionState > , id : & ObjectId ) {
495+ if let Some ( ref alive) = id. id . alive {
496+ let udata = unsafe {
497+ Box :: from_raw ( ffi_dispatch ! (
498+ wayland_client_handle( ) ,
499+ wl_proxy_get_user_data,
500+ id. id. ptr
501+ ) as * mut ProxyUserData )
502+ } ;
503+ unsafe {
504+ ffi_dispatch ! (
505+ wayland_client_handle( ) ,
506+ wl_proxy_set_user_data,
507+ id. id. ptr,
508+ std:: ptr:: null_mut( )
509+ ) ;
510+ }
511+ alive. store ( false , Ordering :: Release ) ;
512+ udata. data . destroyed ( id. clone ( ) ) ;
513+ }
514+
515+ guard. known_proxies . remove ( & id. id . ptr ) ;
516+
517+ unsafe {
518+ ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. id. ptr) ;
519+ }
520+ }
521+
522+ pub fn destroy_object ( & self , id : & ObjectId ) -> Result < ( ) , InvalidId > {
523+ if !id. id . alive . as_ref ( ) . map ( |a| a. load ( Ordering :: Acquire ) ) . unwrap_or ( false ) {
524+ return Err ( InvalidId ) ;
525+ }
526+
527+ self . destroy_object_inner ( & mut self . lock_state ( ) , id) ;
528+ Ok ( ( ) )
529+ }
530+
494531 pub fn send_request (
495532 & self ,
496533 Message { sender_id : ObjectId { id } , opcode, args } : Message < ObjectId , RawFd > ,
@@ -685,31 +722,7 @@ impl InnerBackend {
685722 } ;
686723
687724 if message_desc. is_destructor {
688- if let Some ( ref alive) = id. alive {
689- let udata = unsafe {
690- Box :: from_raw ( ffi_dispatch ! (
691- wayland_client_handle( ) ,
692- wl_proxy_get_user_data,
693- id. ptr
694- ) as * mut ProxyUserData )
695- } ;
696- unsafe {
697- ffi_dispatch ! (
698- wayland_client_handle( ) ,
699- wl_proxy_set_user_data,
700- id. ptr,
701- std:: ptr:: null_mut( )
702- ) ;
703- }
704- alive. store ( false , Ordering :: Release ) ;
705- udata. data . destroyed ( ObjectId { id : id. clone ( ) } ) ;
706- }
707-
708- guard. known_proxies . remove ( & id. ptr ) ;
709-
710- unsafe {
711- ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. ptr) ;
712- }
725+ self . destroy_object_inner ( & mut guard, & ObjectId { id } )
713726 }
714727
715728 Ok ( child_id)
0 commit comments