@@ -515,6 +515,41 @@ impl InnerBackend {
515515 }
516516 }
517517
518+ fn destroy_object_inner ( & self , guard : & mut MutexGuard < ConnectionState > , id : & ObjectId ) {
519+ if let Some ( ref alive) = id. id . alive {
520+ let udata = unsafe {
521+ Box :: from_raw ( ffi_dispatch ! (
522+ wayland_client_handle( ) ,
523+ wl_proxy_get_user_data,
524+ id. id. ptr
525+ ) as * mut ProxyUserData )
526+ } ;
527+ unsafe {
528+ ffi_dispatch ! (
529+ wayland_client_handle( ) ,
530+ wl_proxy_set_user_data,
531+ id. id. ptr,
532+ std:: ptr:: null_mut( )
533+ ) ;
534+ }
535+ alive. store ( false , Ordering :: Release ) ;
536+ udata. data . destroyed ( id. clone ( ) ) ;
537+ }
538+ guard. known_proxies . remove ( & id. id . ptr ) ;
539+ unsafe {
540+ ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. id. ptr) ;
541+ }
542+ }
543+
544+ pub fn destroy_object ( & self , id : & ObjectId ) -> Result < ( ) , InvalidId > {
545+ if !id. id . alive . as_ref ( ) . map ( |a| a. load ( Ordering :: Acquire ) ) . unwrap_or ( false ) {
546+ return Err ( InvalidId ) ;
547+ }
548+
549+ self . destroy_object_inner ( & mut self . lock_state ( ) , id) ;
550+ Ok ( ( ) )
551+ }
552+
518553 pub fn send_request (
519554 & self ,
520555 Message { sender_id : ObjectId { id } , opcode, args } : Message < ObjectId , RawFd > ,
@@ -731,29 +766,7 @@ impl InnerBackend {
731766 } ;
732767
733768 if message_desc. is_destructor {
734- if let Some ( ref alive) = id. alive {
735- let udata = unsafe {
736- Box :: from_raw ( ffi_dispatch ! (
737- wayland_client_handle( ) ,
738- wl_proxy_get_user_data,
739- id. ptr
740- ) as * mut ProxyUserData )
741- } ;
742- unsafe {
743- ffi_dispatch ! (
744- wayland_client_handle( ) ,
745- wl_proxy_set_user_data,
746- id. ptr,
747- std:: ptr:: null_mut( )
748- ) ;
749- }
750- alive. store ( false , Ordering :: Release ) ;
751- udata. data . destroyed ( ObjectId { id : id. clone ( ) } ) ;
752- }
753- guard. known_proxies . remove ( & id. ptr ) ;
754- unsafe {
755- ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. ptr) ;
756- }
769+ self . destroy_object_inner ( & mut guard, & ObjectId { id } )
757770 }
758771
759772 Ok ( child_id)
0 commit comments