dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_stm_term_req.cpp
1 #include "fsm/scd_stm_term_req.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_term_req::set_busy()
9 {
10     _send_term_nack();
11     _fsm.load_state();
12 }
13
14
15 void scd_stm_term_req::set_idle(const sc_core::sc_time& time)
16 {
17     _send_term_nack();
18     _fsm.load_state();
19 }
20
21
22 void scd_stm_term_req::process()
23 {
24     if (!_check_slaves())
25             return;
26
27     std::list<scd_cont_slave_wrapper*>::iterator iter;
28
29     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
30     {
31         if ( !(*iter)->term_req() && !(*iter)->term_ack() )
32         {
33             // received term_nack from this slave
34             _send_term_nack();
35             _fsm.load_state();
36             return;
37         }
38         else if ( !(*iter)->term_ack() )
39         {
40             // this slave did not respond yet
41             return;
42         }
43     }
44
45     // all slaves acknkowledged
46     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
47         (*iter)->send_term();
48
49     _fsm.set_state(_st_terminate);
50 }
51
52
53 void scd_stm_term_req::_send_term_nack()
54 {
55     std::list<scd_cont_slave_wrapper*>::iterator iter;
56
57     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
58         (*iter)->send_term_nack();
59 }