15
15
#include < string>
16
16
#include < cstdio>
17
17
#include < utility>
18
+ #include < functional>
18
19
#include " capnp/ez-rpc.h"
19
20
#include " peloton/capnp/peloton_service.capnp.h"
20
21
#include " common/notifiable_task.h"
@@ -28,39 +29,48 @@ class BrainEnvironment {
28
29
};
29
30
30
31
class BrainJob {
32
+ friend class Brain ;
31
33
public:
34
+ explicit BrainJob (BrainEnvironment *env) : env_(env) {}
35
+ virtual ~BrainJob () = default ;
36
+ inline void Invoke () { OnJobInvocation (env_); }
32
37
// TODO(tianyu): Extend this interface for richer interaction
33
- virtual void RunJob (BrainEnvironment *) = 0;
38
+ virtual void OnJobInvocation (BrainEnvironment *) = 0;
39
+ private:
40
+ BrainEnvironment *env_;
34
41
};
35
42
36
- class ExampleBrainJob : public BrainJob {
43
+ class SimpleBrainJob : public BrainJob {
37
44
public:
38
- void RunJob (BrainEnvironment *) override {
39
- // TODO(tianyu): Replace with real address
40
- capnp::EzRpcClient client (" localhost:15445" );
41
- PelotonService::Client peloton_service = client.getMain <PelotonService>();
42
- auto request = peloton_service.createIndexRequest ();
43
- request.getRequest ().setIndexKeys (42 );
44
- auto response = request.send ().wait (client.getWaitScope ());
45
- }
45
+ explicit SimpleBrainJob (BrainEnvironment *env,
46
+ std::function<void (BrainEnvironment *)> task)
47
+ : BrainJob(env), task_(std::move(task)) {}
48
+ inline void OnJobInvocation (BrainEnvironment *env) override { task_ (env); }
49
+ private:
50
+ std::function<void (BrainEnvironment *)> task_;
46
51
};
47
52
48
53
class Brain {
49
54
public:
50
55
// TODO(tianyu): Add necessary parameters to initialize the brain's resources
51
56
Brain () : scheduler_(0 ) {}
57
+ ~Brain () {
58
+ for (auto entry : jobs_)
59
+ delete entry.second ;
60
+ for (auto entry : job_handles_)
61
+ event_free (entry.second );
62
+ }
52
63
64
+ template <typename BrainJob, typename ... Args>
53
65
inline void RegisterJob (const struct timeval *period,
54
- std::string name,
55
- BrainJob &job) {
56
- auto callback = []( int , short , void *pair) {
57
- auto *job_env_pair = reinterpret_cast <std::pair<BrainJob *, BrainEnvironment *> *>(pair);
58
- job_env_pair-> first -> RunJob (job_env_pair-> second );
66
+ std::string name, Args... args) {
67
+ auto *job = new BrainJob (&env_, args...);
68
+ jobs_[name] = job;
69
+ auto callback = []( int , short , void *arg) {
70
+ reinterpret_cast <BrainJob *>(arg)-> Invoke ( );
59
71
};
60
- // TODO(tianyu) Deal with this memory
61
- auto *pair = new std::pair<BrainJob *, BrainEnvironment *>(&job, &env_);
62
72
job_handles_[name] =
63
- scheduler_.RegisterPeriodicEvent (period, callback, pair );
73
+ scheduler_.RegisterPeriodicEvent (period, callback, job );
64
74
}
65
75
66
76
inline void Run () {
@@ -73,6 +83,7 @@ class Brain {
73
83
74
84
private:
75
85
NotifiableTask scheduler_;
86
+ std::unordered_map<std::string, BrainJob *> jobs_;
76
87
std::unordered_map<std::string, struct event *> job_handles_;
77
88
BrainEnvironment env_;
78
89
};
0 commit comments