summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2018-10-30 20:58:55 +0100
committerRyan Dahl <ry@tinyclouds.org>2018-10-30 12:58:55 -0700
commit946acbc559fab050d13b5f2f66088254ec96f83d (patch)
tree93cd12b60e8d91a482b550949c857bbf4a83cbd0 /src
parent8b39d2c99ef41736bb1d5b74ccda2f3aa6223e84 (diff)
Add resources op (#1119)
Diffstat (limited to 'src')
-rw-r--r--src/msg.fbs13
-rw-r--r--src/ops.rs48
-rw-r--r--src/resources.rs34
3 files changed, 95 insertions, 0 deletions
diff --git a/src/msg.fbs b/src/msg.fbs
index e7ebe6684..ba7031621 100644
--- a/src/msg.fbs
+++ b/src/msg.fbs
@@ -24,6 +24,8 @@ union Any {
Rename,
Readlink,
ReadlinkRes,
+ Resources,
+ ResourcesRes,
Symlink,
Stat,
StatRes,
@@ -270,6 +272,17 @@ table ReadlinkRes {
path: string;
}
+table Resources {}
+
+table Resource {
+ rid: int;
+ repr: string;
+}
+
+table ResourcesRes {
+ resources: [Resource];
+}
+
table Symlink {
oldname: string;
newname: string;
diff --git a/src/ops.rs b/src/ops.rs
index 95522fb6b..ce123ccd2 100644
--- a/src/ops.rs
+++ b/src/ops.rs
@@ -19,6 +19,7 @@ use futures::Poll;
use hyper;
use hyper::rt::{Future, Stream};
use remove_dir_all::remove_dir_all;
+use resources::table_entries;
use std;
use std::fs;
use std::net::{Shutdown, SocketAddr};
@@ -94,6 +95,7 @@ pub fn dispatch(
msg::Any::Read => op_read,
msg::Any::Remove => op_remove,
msg::Any::Rename => op_rename,
+ msg::Any::Resources => op_resources,
msg::Any::SetEnv => op_set_env,
msg::Any::Shutdown => op_shutdown,
msg::Any::Start => op_start,
@@ -1288,3 +1290,49 @@ fn op_metrics(
},
))
}
+
+fn op_resources(
+ _state: Arc<IsolateState>,
+ base: &msg::Base,
+ data: &'static mut [u8],
+) -> Box<Op> {
+ assert_eq!(data.len(), 0);
+ let cmd_id = base.cmd_id();
+
+ let builder = &mut FlatBufferBuilder::new();
+ let serialized_resources = table_entries();
+
+ let res: Vec<_> = serialized_resources
+ .iter()
+ .map(|(key, value)| {
+ let repr = builder.create_string(value);
+
+ msg::Resource::create(
+ builder,
+ &msg::ResourceArgs {
+ rid: key.clone(),
+ repr: Some(repr),
+ ..Default::default()
+ },
+ )
+ }).collect();
+
+ let resources = builder.create_vector(&res);
+ let inner = msg::ResourcesRes::create(
+ builder,
+ &msg::ResourcesResArgs {
+ resources: Some(resources),
+ ..Default::default()
+ },
+ );
+
+ ok_future(serialize_response(
+ cmd_id,
+ builder,
+ msg::BaseArgs {
+ inner: Some(inner.as_union_value()),
+ inner_type: msg::Any::ResourcesRes,
+ ..Default::default()
+ },
+ ))
+}
diff --git a/src/resources.rs b/src/resources.rs
index a959d5c55..72fdf9777 100644
--- a/src/resources.rs
+++ b/src/resources.rs
@@ -58,6 +58,40 @@ enum Repr {
TcpStream(tokio::net::TcpStream),
}
+pub fn table_entries() -> Vec<(i32, String)> {
+ let table = RESOURCE_TABLE.lock().unwrap();
+
+ let tuples = table
+ .iter()
+ .map(|(key, value)| (key.clone(), inspect_repr(&value)))
+ .collect();
+
+ tuples
+}
+
+#[test]
+fn test_table_entries() {
+ let mut entries = table_entries();
+ entries.sort();
+ assert_eq!(entries.len(), 3);
+ assert_eq!(entries[0], (0, String::from("stdin")));
+ assert_eq!(entries[1], (1, String::from("stdout")));
+ assert_eq!(entries[2], (2, String::from("stderr")));
+}
+
+fn inspect_repr(repr: &Repr) -> String {
+ let h_repr = match repr {
+ Repr::Stdin(_) => "stdin",
+ Repr::Stdout(_) => "stdout",
+ Repr::Stderr(_) => "stderr",
+ Repr::FsFile(_) => "fsFile",
+ Repr::TcpListener(_) => "tcpListener",
+ Repr::TcpStream(_) => "tcpStream",
+ };
+
+ String::from(h_repr)
+}
+
// Abstract async file interface.
// Ideally in unix, if Resource represents an OS rid, it will be the same.
#[derive(Debug)]