dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_stm_done.cpp
1 #include "fsm/scd_stm_done.h"
2
3 #include "scd_logging.h"
4 #include "scd_exception.h"
5 #include "scd_cont_man_master.h"
6
7
8 void scd_stm_done::set_busy()
9 {
10     _fsm.set_state(_st_busy);
11 }
12
13
14 void scd_stm_done::set_idle(const sc_core::sc_time& time)
15 {
16     _time_step = time;
17     _fsm.set_state(_st_idle);
18 }
19
20
21 void scd_stm_done::process()
22 {
23     if (!_check_slaves())
24         return;
25     
26     std::list<scd_cont_slave_wrapper*>::iterator iter;
27     bool terminate = true;
28
29     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
30     {
31         if (!(*iter)->idle() && !(*iter)->done())
32         {
33             // this slave is not ready yet
34             return;
35         }
36
37         if (!(*iter)->done())
38             terminate = false;
39     }
40
41     /* all slaves seem idle or done. wait a short moment, to prevent
42      * race conditions (channel data in transit but both endpoints done).
43      * if no socket activity occured we can move on, else we cancel.
44      */
45     if (_sim.get_poller().wait(SCD_CONT_DELAY))
46         return;
47
48     if (terminate)
49     {
50         // all slaves seem to be done
51         for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
52             (*iter)->send_term_req();
53         _fsm.save_state();
54         _fsm.set_state(_st_term_req);
55     }
56     else
57     {
58         // some slaves are not done yet
59         for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
60             (*iter)->send_time_req();
61         _fsm.save_state();
62         _fsm.set_state(_st_time_req);
63     }
64 }