|  | @@ -1,55 +0,0 @@
 | 
											
												
													
														|  | -#![no_std]
 |  | 
 | 
											
												
													
														|  | -#![feature(core_intrinsics)]
 |  | 
 | 
											
												
													
														|  | -#![allow(clippy::needless_return)]
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -use core::intrinsics::unlikely;
 |  | 
 | 
											
												
													
														|  | -use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -/// id分配器
 |  | 
 | 
											
												
													
														|  | -///
 |  | 
 | 
											
												
													
														|  | -/// TODO: 当前只是为了简单实现功能,将来这里应使用类似linux的ida的方式去实现
 |  | 
 | 
											
												
													
														|  | -#[derive(Debug)]
 |  | 
 | 
											
												
													
														|  | -pub struct IdAllocator {
 |  | 
 | 
											
												
													
														|  | -    current_id: AtomicUsize,
 |  | 
 | 
											
												
													
														|  | -    max_id: usize,
 |  | 
 | 
											
												
													
														|  | -    dead: AtomicBool,
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -impl IdAllocator {
 |  | 
 | 
											
												
													
														|  | -    /// 创建一个新的id分配器
 |  | 
 | 
											
												
													
														|  | -    pub const fn new(initial_id: usize, max_id: usize) -> Self {
 |  | 
 | 
											
												
													
														|  | -        Self {
 |  | 
 | 
											
												
													
														|  | -            current_id: AtomicUsize::new(initial_id),
 |  | 
 | 
											
												
													
														|  | -            max_id,
 |  | 
 | 
											
												
													
														|  | -            dead: AtomicBool::new(false),
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    /// 分配一个新的id
 |  | 
 | 
											
												
													
														|  | -    ///
 |  | 
 | 
											
												
													
														|  | -    /// ## 返回
 |  | 
 | 
											
												
													
														|  | -    ///
 |  | 
 | 
											
												
													
														|  | -    /// 如果分配成功,返回Some(id),否则返回None
 |  | 
 | 
											
												
													
														|  | -    pub fn alloc(&self) -> Option<usize> {
 |  | 
 | 
											
												
													
														|  | -        if unlikely(self.dead.load(Ordering::SeqCst)) {
 |  | 
 | 
											
												
													
														|  | -            return None;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        let ret = self.current_id.fetch_add(1, Ordering::SeqCst);
 |  | 
 | 
											
												
													
														|  | -        // 如果id溢出,panic
 |  | 
 | 
											
												
													
														|  | -        if ret == self.max_id {
 |  | 
 | 
											
												
													
														|  | -            self.dead.store(true, Ordering::SeqCst);
 |  | 
 | 
											
												
													
														|  | -            return None;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        return Some(ret);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    pub fn free(&self, _id: usize) {
 |  | 
 | 
											
												
													
														|  | -        // todo: free
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    pub fn get_max_id(&self) -> usize {
 |  | 
 | 
											
												
													
														|  | -        self.max_id
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 |