Skip to content

Commit

Permalink
Fix alignment of ordertree nodes (#954)
Browse files Browse the repository at this point in the history
This ensures casts of local variables don't run into alignment
differences.
  • Loading branch information
ckamm authored Apr 29, 2024
1 parent e4098b4 commit d9c4f69
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
14 changes: 11 additions & 3 deletions programs/mango-v4/src/state/orderbook/nodes.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::mem::size_of;
use std::mem::{align_of, size_of};

use anchor_lang::prelude::*;
use bytemuck::{cast_mut, cast_ref};
Expand Down Expand Up @@ -252,7 +252,9 @@ pub struct FreeNode {
pub(crate) tag: u8, // NodeTag
pub(crate) padding: [u8; 3],
pub(crate) next: NodeHandle,
pub(crate) reserved: [u8; NODE_SIZE - 8],
pub(crate) reserved: [u8; NODE_SIZE - 16],
// ensure that FreeNode has the same 8-byte alignment as other nodes
pub(crate) force_align: u64,
}
const_assert_eq!(size_of::<FreeNode>(), NODE_SIZE);
const_assert_eq!(size_of::<FreeNode>() % 8, 0);
Expand All @@ -261,13 +263,19 @@ const_assert_eq!(size_of::<FreeNode>() % 8, 0);
#[derive(bytemuck::Pod, bytemuck::Zeroable)]
pub struct AnyNode {
pub tag: u8,
pub data: [u8; 119],
pub data: [u8; 111],
// ensure that AnyNode has the same 8-byte alignment as other nodes
pub(crate) force_align: u64,
}
const_assert_eq!(size_of::<AnyNode>(), NODE_SIZE);
const_assert_eq!(size_of::<AnyNode>() % 8, 0);
const_assert_eq!(size_of::<AnyNode>(), size_of::<InnerNode>());
const_assert_eq!(size_of::<AnyNode>(), size_of::<LeafNode>());
const_assert_eq!(size_of::<AnyNode>(), size_of::<FreeNode>());
const_assert_eq!(align_of::<AnyNode>(), 8);
const_assert_eq!(align_of::<AnyNode>(), align_of::<InnerNode>());
const_assert_eq!(align_of::<AnyNode>(), align_of::<LeafNode>());
const_assert_eq!(align_of::<AnyNode>(), align_of::<FreeNode>());

pub(crate) enum NodeRef<'a> {
Inner(&'a InnerNode),
Expand Down
3 changes: 2 additions & 1 deletion programs/mango-v4/src/state/orderbook/ordertree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ impl OrderTreeNodes {
},
padding: Default::default(),
next: self.free_list_head,
reserved: [0; 112],
reserved: [0; 104],
force_align: 0,
});

self.free_list_len += 1;
Expand Down

0 comments on commit d9c4f69

Please sign in to comment.