|  | @@ -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
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 |