mirror of https://github.com/aya-rs/aya
				
				
				
			aya: remove RwLocks and Ref wrappers on bpf maps.
This improves performance by removing the runtime checking of borrowing rules. In order to retain a similar level of flexibility as the previous implementation permitted, `take_map` and `return_map` are added as methods to Bpf, allowing callers to move ownership of a Map. This also removes the need for the parking_lot dependency.pull/118/head
							parent
							
								
									07a6016ebb
								
							
						
					
					
						commit
						b90c1fe349
					
				| @ -1,81 +0,0 @@ | ||||
| use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; | ||||
| use std::{ | ||||
|     mem, | ||||
|     ops::{Deref, DerefMut}, | ||||
|     sync::Arc, | ||||
| }; | ||||
| 
 | ||||
| use crate::maps::Map; | ||||
| 
 | ||||
| pub(crate) struct MapLockError; | ||||
| 
 | ||||
| /* FIXME: write a full RwLock implementation that doesn't use borrowing guards
 | ||||
|  * so that try_read() and try_write() don't have to use the ugly lifetime | ||||
|  * extension hack */ | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub(crate) struct MapLock { | ||||
|     inner: Arc<RwLock<Map>>, | ||||
| } | ||||
| 
 | ||||
| impl MapLock { | ||||
|     pub(crate) fn new(map: Map) -> MapLock { | ||||
|         MapLock { | ||||
|             inner: Arc::new(RwLock::new(map)), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub(crate) fn try_read(&self) -> Result<MapRef, MapLockError> { | ||||
|         let lock: Option<RwLockReadGuard<'static, Map>> = | ||||
|             unsafe { mem::transmute(self.inner.try_read()) }; | ||||
|         lock.map(|guard| MapRef { | ||||
|             _lock: self.inner.clone(), | ||||
|             guard, | ||||
|         }) | ||||
|         .ok_or(MapLockError) | ||||
|     } | ||||
| 
 | ||||
|     pub(crate) fn try_write(&self) -> Result<MapRefMut, MapLockError> { | ||||
|         let lock: Option<RwLockWriteGuard<'static, Map>> = | ||||
|             unsafe { mem::transmute(self.inner.try_write()) }; | ||||
|         lock.map(|guard| MapRefMut { | ||||
|             _lock: self.inner.clone(), | ||||
|             guard, | ||||
|         }) | ||||
|         .ok_or(MapLockError) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A borrowed reference to a BPF map.
 | ||||
| pub struct MapRef { | ||||
|     _lock: Arc<RwLock<Map>>, | ||||
|     guard: RwLockReadGuard<'static, Map>, | ||||
| } | ||||
| 
 | ||||
| /// A mutable borrowed reference to a BPF map.
 | ||||
| pub struct MapRefMut { | ||||
|     _lock: Arc<RwLock<Map>>, | ||||
|     guard: RwLockWriteGuard<'static, Map>, | ||||
| } | ||||
| 
 | ||||
| impl Deref for MapRef { | ||||
|     type Target = Map; | ||||
| 
 | ||||
|     fn deref(&self) -> &Map { | ||||
|         &*self.guard | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Deref for MapRefMut { | ||||
|     type Target = Map; | ||||
| 
 | ||||
|     fn deref(&self) -> &Map { | ||||
|         &*self.guard | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl DerefMut for MapRefMut { | ||||
|     fn deref_mut(&mut self) -> &mut Map { | ||||
|         &mut *self.guard | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue