@@ -23,7 +23,7 @@ use zenoh::{
23
23
ConsolidationMode , Parameters , Selector , TimeBound , TimeExpr , TimeRange , ZenohParameters ,
24
24
} ,
25
25
sample:: { Locality , Sample , SampleKind , SourceSn } ,
26
- session:: { EntityGlobalId , EntityId } ,
26
+ session:: { ClosingCallbackId , EntityGlobalId , EntityId } ,
27
27
Resolvable , Resolve , Session , Wait , KE_ADV_PREFIX , KE_EMPTY , KE_PUB , KE_STAR , KE_STARSTAR ,
28
28
KE_SUB ,
29
29
} ;
@@ -409,6 +409,15 @@ struct State {
409
409
callback : Callback < Sample > ,
410
410
miss_handlers : HashMap < usize , Callback < Miss > > ,
411
411
token : Option < LivelinessToken > ,
412
+ closing_callback_id : Option < ClosingCallbackId > ,
413
+ }
414
+
415
+ impl Drop for State {
416
+ fn drop ( & mut self ) {
417
+ if let Some ( id) = self . closing_callback_id . take ( ) {
418
+ self . session . unregister_closing_callback ( id) ;
419
+ }
420
+ }
412
421
}
413
422
414
423
#[ zenoh_macros:: unstable]
@@ -683,8 +692,21 @@ impl<Handler> AdvancedSubscriber<Handler> {
683
692
callback : callback. clone ( ) ,
684
693
miss_handlers : HashMap :: new ( ) ,
685
694
token : None ,
695
+ closing_callback_id : None ,
686
696
} ) ) ;
687
697
698
+ let closing_callback_id = conf
699
+ . session
700
+ . register_closing_callback ( {
701
+ let statesref = statesref. clone ( ) ;
702
+ move || {
703
+ let mut state = zlock ! ( statesref) ;
704
+ state. callback = Callback :: new ( Arc :: new ( |_| ( ) ) ) ;
705
+ }
706
+ } )
707
+ . map_err ( |_| "session closed" ) ?;
708
+ zlock ! ( statesref) . closing_callback_id = Some ( closing_callback_id) ;
709
+
688
710
let sub_callback = {
689
711
let statesref = statesref. clone ( ) ;
690
712
let session = conf. session . clone ( ) ;
0 commit comments