@@ -499,6 +499,43 @@ impl InnerBackend {
499499 }
500500 }
501501
502+ fn destroy_object_inner ( & self , guard : & mut MutexGuard < ConnectionState > , id : & ObjectId ) {
503+ if let Some ( ref alive) = id. id . alive {
504+ let udata = unsafe {
505+ Box :: from_raw ( ffi_dispatch ! (
506+ wayland_client_handle( ) ,
507+ wl_proxy_get_user_data,
508+ id. id. ptr
509+ ) as * mut ProxyUserData )
510+ } ;
511+ unsafe {
512+ ffi_dispatch ! (
513+ wayland_client_handle( ) ,
514+ wl_proxy_set_user_data,
515+ id. id. ptr,
516+ std:: ptr:: null_mut( )
517+ ) ;
518+ }
519+ alive. store ( false , Ordering :: Release ) ;
520+ udata. data . destroyed ( id. clone ( ) ) ;
521+ }
522+
523+ guard. known_proxies . remove ( & id. id . ptr ) ;
524+
525+ unsafe {
526+ ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. id. ptr) ;
527+ }
528+ }
529+
530+ pub fn destroy_object ( & self , id : & ObjectId ) -> Result < ( ) , InvalidId > {
531+ if !id. id . alive . as_ref ( ) . map ( |a| a. load ( Ordering :: Acquire ) ) . unwrap_or ( false ) {
532+ return Err ( InvalidId ) ;
533+ }
534+
535+ self . destroy_object_inner ( & mut self . lock_state ( ) , id) ;
536+ Ok ( ( ) )
537+ }
538+
502539 pub fn send_request (
503540 & self ,
504541 Message { sender_id : ObjectId { id } , opcode, args } : Message < ObjectId , RawFd > ,
@@ -693,31 +730,7 @@ impl InnerBackend {
693730 } ;
694731
695732 if message_desc. is_destructor {
696- if let Some ( ref alive) = id. alive {
697- let udata = unsafe {
698- Box :: from_raw ( ffi_dispatch ! (
699- wayland_client_handle( ) ,
700- wl_proxy_get_user_data,
701- id. ptr
702- ) as * mut ProxyUserData )
703- } ;
704- unsafe {
705- ffi_dispatch ! (
706- wayland_client_handle( ) ,
707- wl_proxy_set_user_data,
708- id. ptr,
709- std:: ptr:: null_mut( )
710- ) ;
711- }
712- alive. store ( false , Ordering :: Release ) ;
713- udata. data . destroyed ( ObjectId { id : id. clone ( ) } ) ;
714- }
715-
716- guard. known_proxies . remove ( & id. ptr ) ;
717-
718- unsafe {
719- ffi_dispatch ! ( wayland_client_handle( ) , wl_proxy_destroy, id. ptr) ;
720- }
733+ self . destroy_object_inner ( & mut guard, & ObjectId { id } )
721734 }
722735
723736 Ok ( child_id)
0 commit comments