summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/remote-hip/c++/remote.hpp8
-rw-r--r--modules/remote-hip/c++/transfer.hpp7
-rw-r--r--modules/remote-hip/examples/SConscript4
-rw-r--r--modules/remote-hip/examples/hip_transfer_data.cpp51
4 files changed, 67 insertions, 3 deletions
diff --git a/modules/remote-hip/c++/remote.hpp b/modules/remote-hip/c++/remote.hpp
index 7263aaf..b814ff2 100644
--- a/modules/remote-hip/c++/remote.hpp
+++ b/modules/remote-hip/c++/remote.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "common.hpp"
+#include "device.hpp"
namespace saw {
@@ -104,7 +105,12 @@ public:
*/
template<typename Schema, typename Encoding>
error_or<own<data_server<Schema, Encoding, rmt::Hip>>> data_listen(remote_address<rmt::Hip>& dev){
- return heap<data_server<Schema, Encoding, rmt::Hip>>(dev);
+ our<device<rmt::Hip>> dev = nullptr;
+ auto ins = devs_.emplace(std::make_pair(dev.get_device_id(), our<device<rmt::Hip>>{nullptr}));
+ if(ins.second){
+ ins.first->second = share<device<rmt::Hip>>();
+ }
+ return heap<data_server<Schema, Encoding, rmt::Hip>>(ins.first->second);
}
/**
diff --git a/modules/remote-hip/c++/transfer.hpp b/modules/remote-hip/c++/transfer.hpp
index a81f657..4e76436 100644
--- a/modules/remote-hip/c++/transfer.hpp
+++ b/modules/remote-hip/c++/transfer.hpp
@@ -22,7 +22,12 @@ public:
{}
error_or<void> send(const data<Schema,Encoding>& dat, id<Schema> store_id){
- return make_error<err::not_implemented>();
+ auto ins = values_.emplace(std::make_pair(store_id.get_value(), data<Schema, encode::Hip<Encoding>>{dat}));
+ if(!ins.second){
+ return make_error<err::already_exists>();
+ }
+
+ return make_void();
}
error_or<void> allocate(const data<typename meta_schema<Schema>::MetaSchema, Encoding>& dat, id<Schema> store_id){
diff --git a/modules/remote-hip/examples/SConscript b/modules/remote-hip/examples/SConscript
index cb9eb65..71bb98f 100644
--- a/modules/remote-hip/examples/SConscript
+++ b/modules/remote-hip/examples/SConscript
@@ -29,8 +29,10 @@ hip_objects = [];
#objects_static = []
examples_env.hip_info = examples_hip_env.Program('#bin/hip_device_info', ['hip_device_info.cpp', env.library_static, hip_objects]);
+examples_env.hip_transfer = examples_hip_env.Program('#bin/hip_transfer_data', ['hip_transfer_data.cpp', env.library_static, hip_objects]);
+
# Set Alias
-env.examples = [examples_env.hip_info];
+env.examples = [examples_env.hip_info, examples_env.hip_transfer];
env.Alias('examples', env.examples);
if env["build_examples"]:
diff --git a/modules/remote-hip/examples/hip_transfer_data.cpp b/modules/remote-hip/examples/hip_transfer_data.cpp
new file mode 100644
index 0000000..49ff856
--- /dev/null
+++ b/modules/remote-hip/examples/hip_transfer_data.cpp
@@ -0,0 +1,51 @@
+#include "../c++/remote.hpp"
+#include "../c++/transfer.hpp"
+
+#include <iostream>
+
+namespace sch {
+using namespace saw::schema;
+}
+
+saw::error_or<void> real_main(){
+ using namespace saw;
+
+ remote<rmt::Hip> rmt;
+
+ auto eo_addr = rmt.parse_address(0);
+ if(eo_addr.is_error()){
+ return std::move(eo_addr.get_error());
+ }
+ auto& addr = eo_addr.get_value();
+
+ auto eo_dat_srv = rmt.data_listen<sch::Int16, encode::Native>(*addr);
+ if(eo_dat_srv.is_error()){
+ return std::move(eo_dat_srv.get_error());
+ }
+ auto& dat_srv = eo_dat_srv.get_value();
+
+ data<sch::Int16> val{42};
+
+ id<sch::Int16> id_val{0u};
+ auto eo_send = dat_srv->send(val, id_val);
+ if(eo_send.is_error()){
+ return std::move(eo_send.get_error());
+ }
+
+ return make_void();
+}
+
+int main(){
+ auto eov = real_main();
+ if(eov.is_error()){
+ auto& err = eov.get_error();
+ std::cerr<<"Error: "<<err.get_category();
+ auto err_msg = err.get_message();
+ if(err_msg.size() > 0u){
+ std::cerr<<" - "<<err_msg;
+ }
+ std::cerr<<"\n"<<std::endl;
+ return err.get_id();
+ }
+ return 0;
+}