@@ -178,11 +178,11 @@ fn add_file_to_read_index() {
178
178
fn simulatenous_index_destructors ( ) {
179
179
let h1 = thread:: spawn ( || {
180
180
let mut rng = rand:: thread_rng ( ) ;
181
+ let file_path = Path :: new ( "./data/iceland-surface.idx" ) ;
181
182
182
183
for _ in 0 ..10 {
183
- let sleep_time = rng. gen_range ( 12 .. 50 ) ; // randomizing sleep time to hopefully catch segfaults
184
+ let sleep_time = rng. gen_range ( 1 .. 30 ) ; // randomizing sleep time to hopefully catch segfaults
184
185
185
- let file_path = Path :: new ( "./data/iceland-surface.idx" ) ;
186
186
let index_op = CodesIndex :: read_from_file ( file_path)
187
187
. unwrap ( )
188
188
. select ( "shortName" , "2t" )
@@ -201,12 +201,12 @@ fn simulatenous_index_destructors() {
201
201
202
202
let h2 = thread:: spawn ( || {
203
203
let mut rng = rand:: thread_rng ( ) ;
204
+ let keys = vec ! [ "shortName" , "typeOfLevel" , "level" , "stepType" ] ;
205
+ let grib_path = Path :: new ( "./data/iceland-surface.grib" ) ;
204
206
205
207
for _ in 0 ..10 {
206
- let sleep_time = rng. gen_range ( 24 .. 65 ) ; // randomizing sleep time to hopefully catch segfaults
208
+ let sleep_time = rng. gen_range ( 1 .. 42 ) ; // randomizing sleep time to hopefully catch segfaults
207
209
208
- let keys = vec ! [ "shortName" , "typeOfLevel" , "level" , "stepType" ] ;
209
- let grib_path = Path :: new ( "./data/iceland-surface.grib" ) ;
210
210
let index = CodesIndex :: new_from_keys ( & keys)
211
211
. unwrap ( )
212
212
. add_grib_file ( grib_path)
@@ -228,3 +228,34 @@ fn simulatenous_index_destructors() {
228
228
h1. join ( ) . unwrap ( ) ;
229
229
h2. join ( ) . unwrap ( ) ;
230
230
}
231
+
232
+ #[ test]
233
+ fn index_handle_interference ( ) {
234
+ thread:: spawn ( || {
235
+ let file_path = Path :: new ( "./data/iceland.grib" ) ;
236
+
237
+ loop {
238
+ let handle = CodesHandle :: new_from_file ( file_path, ProductKind :: GRIB ) ;
239
+
240
+ assert ! ( handle. is_ok( ) ) ;
241
+ }
242
+ } ) ;
243
+
244
+ let mut rng = rand:: thread_rng ( ) ;
245
+ let keys = vec ! [ "shortName" , "typeOfLevel" , "level" , "stepType" ] ;
246
+ let grib_path = Path :: new ( "./data/iceland.grib" ) ;
247
+
248
+ for _ in 0 ..10 {
249
+ let sleep_time = rng. gen_range ( 1 ..42 ) ; // randomizing sleep time to hopefully catch segfaults
250
+
251
+ let index = CodesIndex :: new_from_keys ( & keys)
252
+ . unwrap ( )
253
+ . add_grib_file ( grib_path)
254
+ . unwrap ( ) ;
255
+ let i_handle = CodesHandle :: new_from_index ( index, ProductKind :: GRIB ) ;
256
+
257
+ assert ! ( i_handle. is_ok( ) ) ;
258
+
259
+ thread:: sleep ( std:: time:: Duration :: from_millis ( sleep_time) ) ;
260
+ }
261
+ }
0 commit comments