+mod bloom;
mod printer;
mod reader;
mod peer;
pub static START_SHUTDOWN: AtomicBool = AtomicBool::new(false);
static SCANNING: AtomicBool = AtomicBool::new(false);
-
-use std::alloc::{GlobalAlloc, Layout, System};
-use std::ptr;
-use std::sync::atomic::AtomicUsize;
-
-// We keep track of all memory allocated by Rust code, refusing new allocations if it exceeds
-// 1.75GB.
-//
-// Note that while Rust's std, in general, should panic in response to a null allocation, it
-// is totally conceivable that some code will instead dereference this null pointer, which
-// would violate our guarantees that Rust modules should never crash the entire application.
-//
-// In the future, as upstream Rust explores a safer allocation API (eg the Alloc API which
-// returns Results instead of raw pointers, or redefining the GlobalAlloc API to allow
-// panic!()s inside of alloc calls), we should switch to those, however these APIs are
-// currently unstable.
-const TOTAL_MEM_LIMIT_BYTES: usize = (1024 + 756) * 1024 * 1024;
-static TOTAL_MEM_ALLOCD: AtomicUsize = AtomicUsize::new(0);
-struct MemoryLimitingAllocator;
-unsafe impl GlobalAlloc for MemoryLimitingAllocator {
- unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
- let len = layout.size();
- if len > TOTAL_MEM_LIMIT_BYTES {
- return ptr::null_mut();
- }
- if TOTAL_MEM_ALLOCD.fetch_add(len, Ordering::AcqRel) + len > TOTAL_MEM_LIMIT_BYTES {
- TOTAL_MEM_ALLOCD.fetch_sub(len, Ordering::AcqRel);
- return ptr::null_mut();
- }
- System.alloc(layout)
- }
-
- unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
- System.dealloc(ptr, layout);
- TOTAL_MEM_ALLOCD.fetch_sub(layout.size(), Ordering::AcqRel);
- }
-}
-
-#[global_allocator]
-static ALLOC: MemoryLimitingAllocator = MemoryLimitingAllocator;
-
-
struct PeerState {
request: Arc<(u64, BlockHash, Block)>,
pong_nonce: u64,
}
fn main() {
- if env::args().len() != 5 {
- println!("USAGE: dnsseed-rust datastore localPeerAddress tor_proxy_addr bgp_peer");
+ if env::args().len() != 6 {
+ println!("USAGE: dnsseed-rust datastore localPeerAddress tor_proxy_addr bgp_peer bgp_peer_asn");
return;
}
unsafe { TOR_PROXY = Some(tor_socks5_sockaddr); }
let bgp_sockaddr: SocketAddr = args.next().unwrap().parse().unwrap();
+ let bgp_peerasn: u32 = args.next().unwrap().parse().unwrap();
Store::new(path).and_then(move |store| {
unsafe { DATA_STORE = Some(Box::new(store)) };
let store = unsafe { DATA_STORE.as_ref().unwrap() };
unsafe { PRINTER = Some(Box::new(Printer::new(store))) };
- let bgp_client = BGPClient::new(bgp_sockaddr, Duration::from_secs(60), unsafe { PRINTER.as_ref().unwrap() });
+ let bgp_client = BGPClient::new(bgp_peerasn, bgp_sockaddr, Duration::from_secs(60), unsafe { PRINTER.as_ref().unwrap() });
make_trusted_conn(trusted_sockaddr, Arc::clone(&bgp_client));
reader::read(store, unsafe { PRINTER.as_ref().unwrap() }, bgp_client);