@@ -11,6 +11,8 @@ use ipc::{self, IpcOneShotServer, IpcReceiver, IpcReceiverSet, IpcSender, IpcSha
11
11
use ipc:: { OpaqueIpcSender } ;
12
12
use router:: ROUTER ;
13
13
use libc;
14
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
15
+ use std:: cell:: RefCell ;
14
16
use std:: io:: Error ;
15
17
use std:: iter;
16
18
use std:: ptr;
@@ -384,3 +386,40 @@ fn test_so_linger() {
384
386
} ;
385
387
assert_eq ! ( val, 42 ) ;
386
388
}
389
+
390
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
391
+ struct HasWeirdSerializer ( Option < String > ) ;
392
+
393
+ thread_local ! { static WEIRD_CHANNEL : RefCell <Option <IpcSender <HasWeirdSerializer >>> = RefCell :: new( None ) }
394
+
395
+ impl Serialize for HasWeirdSerializer {
396
+ fn serialize < S > ( & self , serializer : & mut S ) -> Result < ( ) , S :: Error >
397
+ where S : Serializer
398
+ {
399
+ if self . 0 . is_some ( ) {
400
+ WEIRD_CHANNEL . with ( |chan| { chan. borrow ( ) . as_ref ( ) . unwrap ( ) . send ( HasWeirdSerializer ( None ) ) . unwrap ( ) ; } ) ;
401
+ }
402
+ self . 0 . serialize ( serializer)
403
+ }
404
+ }
405
+
406
+ impl Deserialize for HasWeirdSerializer {
407
+ fn deserialize < D > ( deserializer : & mut D ) -> Result < Self , D :: Error >
408
+ where D : Deserializer
409
+ {
410
+ Ok ( HasWeirdSerializer ( try!( Deserialize :: deserialize ( deserializer) ) ) )
411
+ }
412
+ }
413
+
414
+ #[ test]
415
+ fn test_reentrant ( ) {
416
+ let null = HasWeirdSerializer ( None ) ;
417
+ let hello = HasWeirdSerializer ( Some ( String :: from ( "hello" ) ) ) ;
418
+ let ( sender, receiver) = ipc:: channel ( ) . unwrap ( ) ;
419
+ WEIRD_CHANNEL . with ( |chan| { * chan. borrow_mut ( ) = Some ( sender. clone ( ) ) ; } ) ;
420
+ sender. send ( hello. clone ( ) ) . unwrap ( ) ;
421
+ assert_eq ! ( null, receiver. recv( ) . unwrap( ) ) ;
422
+ assert_eq ! ( hello, receiver. recv( ) . unwrap( ) ) ;
423
+ sender. send ( null. clone ( ) ) . unwrap ( ) ;
424
+ assert_eq ! ( null, receiver. recv( ) . unwrap( ) ) ;
425
+ }
0 commit comments