📄 coop-agent.cc
字号:
/************************************************** * File: coop-agent.cc Author: Suman Banerjee <suman@cs.umd.edu> Date: July 31, 2001 Terms: GPL UNI implementation in myns This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * **************************************************/#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "uninode.h"#include <scheduler.h>#include "app-packet.h"#include "coop-agent.h"#define LOG_COOP_JUNK#define LOG_DATA_PACKETLinkedList<AgentInfo *,int> global_group_members_list;coopAgent::coopAgent (void) : Agent () { // sgt.ca = this;}coopAgent::~coopAgent (void) {}void coopAgent::init (int Id, int Index, Node *N) { Agent::init(Id,Index,N); t = AGENT_APPLICATION_COOP; m_data_seq_no = 0; return;}void coopAgent::start (void) { Agent::start(); if (bse.agent_id == -1) { printf ("[Err] BSE is not known to agent %d\n", id); exit (-1); }#ifdef LOG_COOP_JUNK printf ("[coop %d %d ] At %8.4f start\n", id, n->id, Scheduler::Clock());#endif // LOG_COOP_JUNK AgentInfo * me = new AgentInfo (id,n->id); global_group_members_list.Add(me,id); is_source = false; //AppPacket *ap = new AppPacket(JOIN); //send_pkt(ap,bse.agent_id,bse.node_id); return;}void coopAgent::stop (void) {#ifdef LOG_COOP_JUNK printf ("[coop %d %d ] At %8.4f stop\n", id, n->id, Scheduler::Clock());#endif // LOG_COOP_JUNK void * pos = global_group_members_list.Locate(id); assert (pos != NULL); AgentInfo * me = global_group_members_list.GetAt(pos); global_group_members_list.RemoveAt(pos); delete me; //remove_member_list(); // // sgt.CancelTimer(); Agent::stop(); return;}void coopAgent::remove_member_list (void) { for (void * pos = m_member_list.GetHeadPosition(); pos != NULL; ) { AgentInfo *this_ag = m_member_list.GetAt(pos); void * old_pos = pos; m_member_list.GetNext(pos); m_member_list.RemoveAt(old_pos); delete this_ag; } return;}void coopAgent::specific_send_data_pkt (void) { assert (started == true);#ifdef LOG_DATA_PACKET printf ("[coop %d %d ] At %8.4f source data-pkt : seq %d\n", id, n->id, Scheduler::Clock(), m_data_seq_no);#endif // LOG_DATA_PACKET for (void * pos = global_group_members_list.GetHeadPosition(); pos != NULL; global_group_members_list.GetNext(pos) ) { AgentInfo *this_ag = global_group_members_list.GetAt(pos); AppPacket *ap = new AppPacket(PACKET_DATA); ap->u.data_p.seq_no = m_data_seq_no; send_pkt(ap,this_ag->agent_id,this_ag->node_id); } m_data_seq_no ++; return;}void coopAgent::specific_rx_pkt_handler (Packet *p) { if (p->t != PACKET_APP) { printf ("[Err] COOP %d received unknown packet type\n", id); return; } AppPacket *ap = (AppPacket *)p; switch (ap->st) { case PACKET_DATA: handle_data_packet(ap); break; case SOURCE_UPDATE : // handle_source_update(ap); // break; default : printf ("[Err] COOP %d received unknown packet subtype\n", id); } return;}void coopAgent::handle_source_update (AppPacket *ap) { assert (ap->st == SOURCE_UPDATE); if (is_source == false) return; remove_member_list(); for (int i = 0; i < ap->u.sourceupdate_p.count; i++) { AgentInfo * this_ag = new AgentInfo(ap->u.sourceupdate_p.arr[i].agent_id,ap->u.sourceupdate_p.arr[i].node_id); m_member_list.Add(this_ag, ap->u.sourceupdate_p.arr[i].agent_id); } return;}void coopAgent::handle_data_packet (AppPacket *ap) { assert (ap->st == PACKET_DATA);#ifdef LOG_DATA_PACKET printf ("[coop %d %d ] At %8.4f recv data-pkt : < [ %d %d ] > seq %d\n", id, n->id, Scheduler::Clock(), ap->src_agent, ap->src, ap->u.data_p.seq_no);#endif // LOG_DATA_PACKET return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -