Line data Source code
1 : use std::sync::Arc;
2 :
3 : use rand::Rng;
4 :
5 : use crate::proto::NodeEvent;
6 :
7 : use super::{
8 : chan::Chan,
9 : network::TCP,
10 : world::{Node, NodeId, World},
11 : };
12 :
13 : /// Abstraction with all functions (aka syscalls) available to the node.
14 : #[derive(Clone)]
15 : pub struct NodeOs {
16 : world: Arc<World>,
17 : internal: Arc<Node>,
18 : }
19 :
20 : impl NodeOs {
21 76137 : pub fn new(world: Arc<World>, internal: Arc<Node>) -> NodeOs {
22 76137 : NodeOs { world, internal }
23 76137 : }
24 :
25 : /// Get the node id.
26 39340 : pub fn id(&self) -> NodeId {
27 39340 : self.internal.id
28 39340 : }
29 :
30 : /// Opens a bidirectional connection with the other node. Always successful.
31 137836 : pub fn open_tcp(&self, dst: NodeId) -> TCP {
32 137836 : self.world.open_tcp(dst)
33 137836 : }
34 :
35 : /// Returns a channel to receive node events (socket Accept and internal messages).
36 77704 : pub fn node_events(&self) -> Chan<NodeEvent> {
37 77704 : self.internal.node_events()
38 77704 : }
39 :
40 : /// Get current time.
41 1284720 : pub fn now(&self) -> u64 {
42 1284720 : self.world.now()
43 1284720 : }
44 :
45 : /// Generate a random number in range [0, max).
46 135663 : pub fn random(&self, max: u64) -> u64 {
47 135663 : self.internal.rng.lock().gen_range(0..max)
48 135663 : }
49 :
50 : /// Append a new event to the world event log.
51 110580 : pub fn log_event(&self, data: String) {
52 110580 : self.internal.log_event(data)
53 110580 : }
54 : }
|