Orderbook: Avoid usize fields in data

This commit is contained in:
Christian Kamm 2022-06-18 17:49:07 +02:00
parent 6ff4ff5910
commit be98f6524a
3 changed files with 34 additions and 31 deletions

View File

@ -38,16 +38,17 @@ pub struct BookSide {
// pub meta_data: MetaData, // pub meta_data: MetaData,
// todo: do we want this type at this level? // todo: do we want this type at this level?
pub book_side_type: BookSideType, pub book_side_type: BookSideType,
pub bump_index: usize, pub padding: [u8; 3],
pub free_list_len: usize, pub bump_index: u32,
pub free_list_len: u32,
pub free_list_head: NodeHandle, pub free_list_head: NodeHandle,
pub root_node: NodeHandle, pub root_node: NodeHandle,
pub leaf_count: usize, pub leaf_count: u32,
pub nodes: [AnyNode; MAX_BOOK_NODES], pub nodes: [AnyNode; MAX_BOOK_NODES],
} }
const_assert_eq!( const_assert_eq!(
std::mem::size_of::<BookSide>(), std::mem::size_of::<BookSide>(),
8 + 8 * 2 + 4 + 4 + 8 + 88 * 1024 1 + 3 + 4 * 2 + 4 + 4 + 4 + 88 * 1024
); );
const_assert_eq!(std::mem::size_of::<BookSide>() % 8, 0); const_assert_eq!(std::mem::size_of::<BookSide>() % 8, 0);
@ -277,12 +278,12 @@ impl BookSide {
if self.free_list_len == 0 { if self.free_list_len == 0 {
require!( require!(
self.bump_index < self.nodes.len() && self.bump_index < (u32::MAX as usize), (self.bump_index as usize) < self.nodes.len() && self.bump_index < u32::MAX,
MangoError::SomeError // todo MangoError::SomeError // todo
); );
self.nodes[self.bump_index] = *val; self.nodes[self.bump_index as usize] = *val;
let key = self.bump_index as u32; let key = self.bump_index;
self.bump_index += 1; self.bump_index += 1;
return Ok(key); return Ok(key);
} }
@ -391,7 +392,7 @@ impl BookSide {
} }
pub fn is_full(&self) -> bool { pub fn is_full(&self) -> bool {
self.free_list_len <= 1 && self.bump_index >= self.nodes.len() - 1 self.free_list_len <= 1 && (self.bump_index as usize) >= self.nodes.len() - 1
} }
/// When a node changes, the parents' child_earliest_expiry may need to be updated. /// When a node changes, the parents' child_earliest_expiry may need to be updated.
@ -450,6 +451,7 @@ mod tests {
fn new_bookside(book_side_type: BookSideType) -> BookSide { fn new_bookside(book_side_type: BookSideType) -> BookSide {
BookSide { BookSide {
book_side_type, book_side_type,
padding: [0u8; 3],
bump_index: 0, bump_index: 0,
free_list_len: 0, free_list_len: 0,
free_list_head: 0, free_list_head: 0,

View File

@ -24,6 +24,7 @@ mod tests {
fn new_bookside(book_side_type: BookSideType) -> BookSide { fn new_bookside(book_side_type: BookSideType) -> BookSide {
BookSide { BookSide {
book_side_type, book_side_type,
padding: [0u8; 3],
bump_index: 0, bump_index: 0,
free_list_len: 0, free_list_len: 0,
free_list_head: 0, free_list_head: 0,

View File

@ -8,24 +8,24 @@ use std::mem::size_of;
use super::Side; use super::Side;
pub const MAX_NUM_EVENTS: usize = 512; pub const MAX_NUM_EVENTS: u32 = 512;
pub trait QueueHeader: bytemuck::Pod { pub trait QueueHeader: bytemuck::Pod {
type Item: bytemuck::Pod + Copy; type Item: bytemuck::Pod + Copy;
fn head(&self) -> usize; fn head(&self) -> usize;
fn set_head(&mut self, value: usize); fn set_head(&mut self, value: u32);
fn count(&self) -> usize; fn count(&self) -> usize;
fn set_count(&mut self, value: usize); fn set_count(&mut self, value: u32);
fn incr_event_id(&mut self); fn incr_event_id(&mut self);
fn decr_event_id(&mut self, n: usize); fn decr_event_id(&mut self, n: u64);
} }
#[account(zero_copy)] #[account(zero_copy)]
pub struct EventQueue { pub struct EventQueue {
pub header: EventQueueHeader, pub header: EventQueueHeader,
pub buf: [AnyEvent; MAX_NUM_EVENTS], pub buf: [AnyEvent; MAX_NUM_EVENTS as usize],
} }
impl EventQueue { impl EventQueue {
@ -53,7 +53,7 @@ impl EventQueue {
self.buf[slot] = value; self.buf[slot] = value;
let count = self.header.count(); let count = self.header.count();
self.header.set_count(count + 1); self.header.set_count((count + 1) as u32); // guaranteed because of full() check
self.header.incr_event_id(); self.header.incr_event_id();
Ok(()) Ok(())
@ -79,10 +79,10 @@ impl EventQueue {
let value = self.buf[self.header.head()]; let value = self.buf[self.header.head()];
let count = self.header.count(); let count = self.header.count();
self.header.set_count(count - 1); self.header.set_count((count - 1) as u32);
let head = self.header.head(); let head = self.header.head();
self.header.set_head((head + 1) % self.buf.len()); self.header.set_head(((head + 1) % self.buf.len()) as u32);
Ok(value) Ok(value)
} }
@ -90,8 +90,8 @@ impl EventQueue {
pub fn revert_pushes(&mut self, desired_len: usize) -> Result<()> { pub fn revert_pushes(&mut self, desired_len: usize) -> Result<()> {
require!(desired_len <= self.header.count(), MangoError::SomeError); require!(desired_len <= self.header.count(), MangoError::SomeError);
let len_diff = self.header.count() - desired_len; let len_diff = self.header.count() - desired_len;
self.header.set_count(desired_len); self.header.set_count(desired_len as u32);
self.header.decr_event_id(len_diff); self.header.decr_event_id(len_diff as u64);
Ok(()) Ok(())
} }
@ -125,35 +125,35 @@ impl<'a> Iterator for EventQueueIterator<'a> {
#[zero_copy] #[zero_copy]
#[derive(Pod)] #[derive(Pod)]
pub struct EventQueueHeader { pub struct EventQueueHeader {
head: usize, head: u32,
count: usize, count: u32,
pub seq_num: usize, pub seq_num: u64,
} }
impl QueueHeader for EventQueueHeader { impl QueueHeader for EventQueueHeader {
type Item = AnyEvent; type Item = AnyEvent;
fn head(&self) -> usize { fn head(&self) -> usize {
self.head self.head as usize
} }
fn set_head(&mut self, value: usize) { fn set_head(&mut self, value: u32) {
self.head = value; self.head = value;
} }
fn count(&self) -> usize { fn count(&self) -> usize {
self.count self.count as usize
} }
fn set_count(&mut self, value: usize) { fn set_count(&mut self, value: u32) {
self.count = value; self.count = value;
} }
fn incr_event_id(&mut self) { fn incr_event_id(&mut self) {
self.seq_num += 1; self.seq_num += 1;
} }
fn decr_event_id(&mut self, n: usize) { fn decr_event_id(&mut self, n: u64) {
self.seq_num -= n; self.seq_num -= n;
} }
} }
const_assert_eq!(std::mem::size_of::<EventQueue>(), 8 * 3 + 512 * 200); const_assert_eq!(std::mem::size_of::<EventQueue>(), 4 * 2 + 8 + 512 * 200);
const_assert_eq!(std::mem::size_of::<EventQueue>() % 8, 0); const_assert_eq!(std::mem::size_of::<EventQueue>() % 8, 0);
const EVENT_SIZE: usize = 200; const EVENT_SIZE: usize = 200;
@ -184,7 +184,7 @@ pub struct FillEvent {
pub market_fees_applied: bool, pub market_fees_applied: bool,
pub padding: [u8; 3], pub padding: [u8; 3],
pub timestamp: u64, pub timestamp: u64,
pub seq_num: usize, // note: usize same as u64 pub seq_num: u64,
pub maker: Pubkey, pub maker: Pubkey,
pub maker_order_id: i128, pub maker_order_id: i128,
@ -212,7 +212,7 @@ impl FillEvent {
maker_out: bool, maker_out: bool,
maker_slot: u8, maker_slot: u8,
timestamp: u64, timestamp: u64,
seq_num: usize, seq_num: u64,
maker: Pubkey, maker: Pubkey,
maker_order_id: i128, maker_order_id: i128,
maker_client_order_id: u64, maker_client_order_id: u64,
@ -272,7 +272,7 @@ pub struct OutEvent {
pub owner_slot: u8, pub owner_slot: u8,
padding0: [u8; 5], padding0: [u8; 5],
pub timestamp: u64, pub timestamp: u64,
pub seq_num: usize, pub seq_num: u64,
pub owner: Pubkey, pub owner: Pubkey,
pub quantity: i64, pub quantity: i64,
padding1: [u8; EVENT_SIZE - 64], padding1: [u8; EVENT_SIZE - 64],
@ -284,7 +284,7 @@ impl OutEvent {
side: Side, side: Side,
owner_slot: u8, owner_slot: u8,
timestamp: u64, timestamp: u64,
seq_num: usize, seq_num: u64,
owner: Pubkey, owner: Pubkey,
quantity: i64, quantity: i64,
) -> Self { ) -> Self {