summaryrefslogtreecommitdiff
path: root/modules/remote-sycl/c++/remote.hpp
blob: fe136127ceccbaed9e231d58cd60f9cd9de71624 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma once

namespace saw {

template<>
struct remote_address<rmt::Sycl> {
private:
	remote<rmt::Sycl>* ctx_;
	our<device<rmt::Sycl>> device_;

	SAW_FORBID_COPY(remote_address);
	SAW_FORBID_MOVE(remote_address);
public:
	remote_address(remote<rmt::Sycl>& r_ctx, our<device<rmt::Sycl>> d_ctx):
		ctx_{&r_ctx},
		device_{std::move(d_ctx)}
	{}

	our<device<rmt::Sycl>> copy_device_reference() const {
		return device_;
	}

	device<rmt::Sycl>& get_device(){
		return *device_;
	}
};

template<>
class remote<rmt::Sycl> {
private:
	SAW_FORBID_COPY(remote);
	SAW_FORBID_MOVE(remote);
public:
	/**
	 * Default constructor
	 */
	remote(){}

	/**
	 * For now we don't need to specify the location since
	 * we just create a default.
	 */
	conveyor<own<remote_address<rmt::Sycl>>> resolve_address(){
		auto dev = std::make_shared<device<rmt::Sycl>>();
		return heap<remote_address<rmt::Sycl>>(*this, std::move(dev));
	}

	/**
	 * Parse address, but don't resolve it.
	 */
	error_or<own<remote_address<rmt::Sycl>>> parse_address(){
		auto dev = std::make_shared<device<rmt::Sycl>>();
		return heap<remote_address<rmt::Sycl>>(*this, std::move(dev));
	}

	/**
	 * Spin up a rpc server
	 */
	template<typename Iface, typename Encoding, typename Storage>
	rpc_server<Iface, Encoding, Storage, rmt::Sycl> listen(remote_address<rmt::Sycl>& dev, typename rpc_server<Iface, Encoding, Storage, rmt::Sycl>::InterfaceT iface){
		//using RpcServerT = rpc_server<Iface, Encoding, rmt::Sycl>;
		//using InterfaceT = typename RpcServerT::InterfaceT;
		return {dev.copy_device_reference(), std::move(iface)};
	}
};

}