summaryrefslogtreecommitdiff
path: root/modules/thread/c++/remote.hpp
blob: 37f89ade887ec0e27f0c8d9d8d94e38909fdd926 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#pragma once

#include <thread>

namespace saw {
/**
 * ### Device ###
 * Device acts a launcher?
 * 
 * Acts a logical device.
 * Though logical devices are not findable by an address as of now.
 *
 * Generally a device represents some info about the remote object?
 * But what exactly? Does it store capabilities?
 *
 * In that case I'd prefer it has compile time information about
 * those.
 * 
 * ### RpcServer ###
 * Should always be created on the side which it is run on.
 * For SYCL it's kernel launches, so it's created on the local
 * thread.
 * For Threads it's supposed to be created on the remote thread.
 * How do I solve this cleanly?
 * Technically the server shouldn't know about the device.
 * It should register with an authority, so it gets requests
 * though.
 */
namespace rmt {
struct Thread {};
}

/**
 * A device representing a remote thread. Technically it's
 * a logical distinction and not a physical.
 */
template<>
class device<rmt::Thread> final {
private:
	event_loop ev_loop_;
	bool keep_running_;
	std::function<void()> run_func_;

	std::thread thread_;

	void run(){
		wait_scope wait{ev_loop_};

		while(keep_running_){
			run_func_();
			wait.wait(std::chrono::seconds{16u});
		}

		wait.poll();
	}
public:
	template<typename Func>
	device(Func func):
		ev_loop_{},
		keep_running_{true},
		run_func_{std::move(func)}
		thread_{&device<rmt::Thread>::run, this},
	{}

	void stop(){
		keep_running_ = false;
	}
};

template<>
class remote<rmt::Thread> final {
	private:
public:
		remote() = default;

		conveyor<own<remote_address<rmt::Thread>>> resolve_address(){
			return heap<remote_address<rmt::Thread>>(*this);
		}

		device<rmt::Thread> connect_device(const remote_address<rmt::Thread>& ){
			return {};
		}
};
}