@@ -1118,3 +1118,46 @@ fn test_ssl_set_compliance() {
11181118 ssl. set_compliance_policy ( CompliancePolicy :: NONE )
11191119 . expect_err ( "Testing expect err if set compliance policy to NONE" ) ;
11201120}
1121+
1122+ #[ test]
1123+ fn ex_data_drop ( ) {
1124+ use crate :: ssl:: SslContextBuilder ;
1125+ use std:: sync:: atomic:: AtomicU32 ;
1126+ use std:: sync:: atomic:: Ordering :: Relaxed ;
1127+ use std:: sync:: Arc ;
1128+
1129+ struct TrackDrop ( Arc < AtomicU32 > ) ;
1130+ impl Drop for TrackDrop {
1131+ fn drop ( & mut self ) {
1132+ self . 0 . fetch_add ( 1 , Relaxed ) ;
1133+ }
1134+ }
1135+
1136+ let mut ctx = SslContextBuilder :: new ( SslMethod :: tls ( ) ) . unwrap ( ) ;
1137+ let index = SslContext :: new_ex_index ( ) . unwrap ( ) ;
1138+ let d1 = Arc :: new ( AtomicU32 :: new ( 100 ) ) ;
1139+ let d2 = Arc :: new ( AtomicU32 :: new ( 200 ) ) ;
1140+ let d3 = Arc :: new ( AtomicU32 :: new ( 300 ) ) ;
1141+ ctx. set_ex_data ( index, TrackDrop ( d1. clone ( ) ) ) ;
1142+ assert_eq ! ( 100 , d1. load( Relaxed ) ) ;
1143+ assert_eq ! ( 200 , d2. load( Relaxed ) ) ;
1144+ ctx. replace_ex_data ( index, TrackDrop ( d2. clone ( ) ) ) ;
1145+ assert_eq ! ( 101 , d1. load( Relaxed ) ) ;
1146+ assert_eq ! ( 200 , d2. load( Relaxed ) ) ;
1147+ ctx. replace_ex_data ( index, TrackDrop ( d3. clone ( ) ) ) ;
1148+ assert_eq ! ( 101 , d1. load( Relaxed ) ) ;
1149+ assert_eq ! ( 201 , d2. load( Relaxed ) ) ;
1150+ assert_eq ! ( 300 , d3. load( Relaxed ) ) ;
1151+ drop ( ctx) ;
1152+ assert_eq ! ( 101 , d1. load( Relaxed ) ) ;
1153+ assert_eq ! ( 201 , d2. load( Relaxed ) ) ;
1154+ assert_eq ! ( 301 , d3. load( Relaxed ) ) ;
1155+
1156+ let mut ctx2 = SslContextBuilder :: new ( SslMethod :: tls ( ) ) . unwrap ( ) ;
1157+
1158+ ctx2. set_ex_data ( index, TrackDrop ( d1. clone ( ) ) ) ;
1159+ ctx2. set_ex_data ( index, TrackDrop ( d2. clone ( ) ) ) ;
1160+ drop ( ctx2) ;
1161+ assert_eq ! ( 102 , d1. load( Relaxed ) ) ;
1162+ assert_eq ! ( 202 , d2. load( Relaxed ) ) ;
1163+ }
0 commit comments