00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kernel.h"
00023 #include "agent.h"
00024 #include "message.h"
00025
00026 #include <cassert>
00027 #include <iostream>
00028
00029
00030 Kernel* Kernel::m_singleton = NULL;
00031
00032
00033
00034 Kernel::Kernel():
00035 m_step(0),
00036 m_agent_uniq_id(1)
00037 {
00038 m_singleton = this;
00039 }
00040
00041
00042
00043 Kernel::~Kernel()
00044 {
00045
00046 m_white_pages_it it=m_white_pages.begin(), end=m_white_pages.end();
00047 for (; it != end; ++it) {
00048 it->second->die();
00049 delete it->second;
00050 }
00051 m_white_pages.clear();
00052 m_singleton = NULL;
00053 }
00054
00055
00056
00057 unsigned long Kernel::getStep() const
00058 {
00059 return m_step;
00060 }
00061
00062
00063
00064 void Kernel::live()
00065 {
00066
00067 ++m_step;
00068
00069
00070
00071
00072 m_agent_dying_it a_it=m_agent_dying.begin(), a_end=m_agent_dying.end();
00073 for (; a_it != a_end; ++a_it) {
00074 MAS_DEBUG( "Agent: " << (*a_it)->getId() << " has been killed " );
00075 (*a_it)->die();
00076 delete *a_it;
00077 }
00078 if (!m_agent_dying.empty())
00079 m_agent_dying.clear();
00080
00081
00082 m_white_pages_it it=m_white_pages.begin(), end=m_white_pages.end();
00083 for (; it != end; ++it)
00084 (*it->second).live();
00085 }
00086
00087
00088
00089 Kernel*
00090 Kernel::getSingleton()
00091 {
00092 return m_singleton;
00093 }
00094
00095
00096
00097 AgentID_t Kernel::getAgentUniqId()
00098 {
00099 return m_agent_uniq_id++;
00100 }
00101
00102
00103
00104 void Kernel::registerAgent(Agent *agent)
00105 {
00106 m_white_pages[agent->getId()] = agent;
00107 }
00108
00109
00110
00111 void
00112 Kernel::unregisterAgent(Agent *agent)
00113 {
00114 m_white_pages.erase(agent->getId());
00115 }
00116
00117
00118
00119 void Kernel::registerRole(Agent* agent, Role_t role)
00120 {
00121 m_yellow_pages[role].push_back(agent);
00122 }
00123
00124
00125
00126 void
00127 Kernel::unregisterRole(Agent* agent, Role_t role)
00128 {
00129 m_agent_set_it iter = find( m_yellow_pages[role].begin(), m_yellow_pages[role].end(), agent);
00130 if (iter != m_yellow_pages[role].end())
00131 m_yellow_pages[role].erase(iter);
00132 }
00133
00134
00135
00136 void
00137 Kernel::killAgent(Agent* agent)
00138 {
00139 Message msg = Message( Message::MSG_AGENT_DIE );
00140
00141 this->sendMessageToAgent(agent->getId(), msg);
00142 m_agent_dying.push_back(agent);
00143 }
00144
00145
00146
00147 void Kernel::sendMessage(Role_t role, const Message &msg)
00148 {
00149 m_yellow_pages_it set_it=m_yellow_pages.find(role);
00150 if (set_it == m_yellow_pages.end()) return;
00151 m_agent_set_it
00152 it = (*set_it).second.begin(),
00153 end = (*set_it).second.end();
00154 for (; it != end; ++it)
00155 {
00156 (**it).receiveMessage(msg);
00157 }
00158 }
00159
00160
00161
00162 Agent& Kernel::getAgentById(AgentID_t agent)
00163 {
00164 assert (m_white_pages.find(agent) != m_white_pages.end());
00165 return *m_white_pages[agent];
00166 }
00167
00168
00169
00170 void Kernel::sendMessageToAgent(AgentID_t agent, const Message &msg)
00171 {
00172 getAgentById(agent).receiveMessage(msg);
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206