@@ -553,15 +553,20 @@ impl IpcReceiverSet {
553
553
derive( PartialEq )
554
554
) ]
555
555
pub struct IpcSharedMemory {
556
- os_shared_memory : OsIpcSharedMemory ,
556
+ /// None represents no data (empty slice)
557
+ os_shared_memory : Option < OsIpcSharedMemory > ,
557
558
}
558
559
559
560
impl Deref for IpcSharedMemory {
560
561
type Target = [ u8 ] ;
561
562
562
563
#[ inline]
563
564
fn deref ( & self ) -> & [ u8 ] {
564
- & self . os_shared_memory
565
+ if let Some ( os_shared_memory) = & self . os_shared_memory {
566
+ os_shared_memory
567
+ } else {
568
+ & [ ]
569
+ }
565
570
}
566
571
}
567
572
@@ -571,16 +576,22 @@ impl<'de> Deserialize<'de> for IpcSharedMemory {
571
576
D : Deserializer < ' de > ,
572
577
{
573
578
let index: usize = Deserialize :: deserialize ( deserializer) ?;
574
- let os_shared_memory = OS_IPC_SHARED_MEMORY_REGIONS_FOR_DESERIALIZATION . with (
575
- |os_ipc_shared_memory_regions_for_deserialization| {
576
- // FIXME(pcwalton): This could panic if the data was corrupt and the index was out
577
- // of bounds. We should return an `Err` result instead.
578
- os_ipc_shared_memory_regions_for_deserialization. borrow_mut ( ) [ index]
579
- . take ( )
580
- . unwrap ( )
581
- } ,
582
- ) ;
583
- Ok ( IpcSharedMemory { os_shared_memory } )
579
+ if index == usize:: MAX {
580
+ Ok ( IpcSharedMemory :: empty ( ) )
581
+ } else {
582
+ let os_shared_memory = OS_IPC_SHARED_MEMORY_REGIONS_FOR_DESERIALIZATION . with (
583
+ |os_ipc_shared_memory_regions_for_deserialization| {
584
+ // FIXME(pcwalton): This could panic if the data was corrupt and the index was out
585
+ // of bounds. We should return an `Err` result instead.
586
+ os_ipc_shared_memory_regions_for_deserialization. borrow_mut ( ) [ index]
587
+ . take ( )
588
+ . unwrap ( )
589
+ } ,
590
+ ) ;
591
+ Ok ( IpcSharedMemory {
592
+ os_shared_memory : Some ( os_shared_memory) ,
593
+ } )
594
+ }
584
595
}
585
596
}
586
597
@@ -589,32 +600,52 @@ impl Serialize for IpcSharedMemory {
589
600
where
590
601
S : Serializer ,
591
602
{
592
- let index = OS_IPC_SHARED_MEMORY_REGIONS_FOR_SERIALIZATION . with (
593
- |os_ipc_shared_memory_regions_for_serialization| {
594
- let mut os_ipc_shared_memory_regions_for_serialization =
595
- os_ipc_shared_memory_regions_for_serialization. borrow_mut ( ) ;
596
- let index = os_ipc_shared_memory_regions_for_serialization. len ( ) ;
597
- os_ipc_shared_memory_regions_for_serialization. push ( self . os_shared_memory . clone ( ) ) ;
598
- index
599
- } ,
600
- ) ;
601
- index. serialize ( serializer)
603
+ if let Some ( os_shared_memory) = & self . os_shared_memory {
604
+ let index = OS_IPC_SHARED_MEMORY_REGIONS_FOR_SERIALIZATION . with (
605
+ |os_ipc_shared_memory_regions_for_serialization| {
606
+ let mut os_ipc_shared_memory_regions_for_serialization =
607
+ os_ipc_shared_memory_regions_for_serialization. borrow_mut ( ) ;
608
+ let index = os_ipc_shared_memory_regions_for_serialization. len ( ) ;
609
+ os_ipc_shared_memory_regions_for_serialization. push ( os_shared_memory. clone ( ) ) ;
610
+ index
611
+ } ,
612
+ ) ;
613
+ debug_assert ! ( index < usize :: MAX ) ;
614
+ index
615
+ } else {
616
+ usize:: MAX
617
+ }
618
+ . serialize ( serializer)
602
619
}
603
620
}
604
621
605
622
impl IpcSharedMemory {
623
+ const fn empty ( ) -> Self {
624
+ Self {
625
+ os_shared_memory : None ,
626
+ }
627
+ }
628
+
606
629
/// Create shared memory initialized with the bytes provided.
607
630
pub fn from_bytes ( bytes : & [ u8 ] ) -> IpcSharedMemory {
608
- IpcSharedMemory {
609
- os_shared_memory : OsIpcSharedMemory :: from_bytes ( bytes) ,
631
+ if bytes. is_empty ( ) {
632
+ IpcSharedMemory :: empty ( )
633
+ } else {
634
+ IpcSharedMemory {
635
+ os_shared_memory : Some ( OsIpcSharedMemory :: from_bytes ( bytes) ) ,
636
+ }
610
637
}
611
638
}
612
639
613
640
/// Create a chunk of shared memory that is filled with the byte
614
641
/// provided.
615
642
pub fn from_byte ( byte : u8 , length : usize ) -> IpcSharedMemory {
616
- IpcSharedMemory {
617
- os_shared_memory : OsIpcSharedMemory :: from_byte ( byte, length) ,
643
+ if length == 0 {
644
+ IpcSharedMemory :: empty ( )
645
+ } else {
646
+ IpcSharedMemory {
647
+ os_shared_memory : Some ( OsIpcSharedMemory :: from_byte ( byte, length) ) ,
648
+ }
618
649
}
619
650
}
620
651
}
0 commit comments