]> AND Private Git Repository - loba.git/blob - communicator.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
fb06d3448be6f7710e365ace3a0c60ea61bd6450
[loba.git] / communicator.h
1 // Asynchronous communicator
2
3 #ifndef COMMUNICATOR_H
4 #define COMMUNICATOR_H
5
6 #include <list>
7 #include <string>
8 #include <msg/msg.h>
9 #include "hostdata.h"
10
11 class message {
12 public:
13     enum message_type { INFO, CREDIT, LOAD, CTRL_CLOSE, DATA_CLOSE };
14
15     message(message_type t, double a): type(t), amount(a) { }
16
17     message_type get_type() const       { return type;   }
18     double get_amount() const           { return amount; }
19
20     std::string to_string();
21
22 private:
23     message_type type;
24     double amount;
25 };
26
27 class communicator {
28 public:
29     communicator();
30     ~communicator();
31
32     void listen();
33
34     void send(const char* dest, message* msg);
35     bool recv(message*& msg, m_host_t& from, bool wait);
36     void flush(bool wait);
37
38     void next_close_on_ctrl_is_last();
39     void next_close_on_data_is_last();
40
41 private:
42     // Myself
43     const hostdata* host;
44
45     // List of pending send communications
46     std::list<msg_comm_t> sent_comm;
47     static const int send_count_before_flush;
48     int send_counter;
49
50     // Control channel for receiving
51     m_task_t    ctrl_task;
52     msg_comm_t  ctrl_comm;
53     bool        ctrl_close_is_last;
54
55     // Data channel for receiving
56     m_task_t    data_task;
57     msg_comm_t  data_comm;
58     bool        data_close_is_last;
59
60     const char* get_ctrl_mbox() const   { return host->get_ctrl_mbox(); }
61     const char* get_data_mbox() const   { return host->get_data_mbox(); }
62
63     static bool comm_test_n_destroy(msg_comm_t comm);
64 };
65
66 #endif // !COMMUNICATOR_H
67
68 // Local variables:
69 // mode: c++
70 // End: