difftimer.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2004-2005 by the University of Southern California
  3.  * $Id: difftimer.cc,v 1.4 2005/09/13 20:47:34 johnh Exp $
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License,
  7.  * version 2, as published by the Free Software Foundation.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License along
  15.  * with this program; if not, write to the Free Software Foundation, Inc.,
  16.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  17.  *
  18.  *
  19.  * The copyright of this module includes the following
  20.  * linking-with-specific-other-licenses addition:
  21.  *
  22.  * In addition, as a special exception, the copyright holders of
  23.  * this module give you permission to combine (via static or
  24.  * dynamic linking) this module with free software programs or
  25.  * libraries that are released under the GNU LGPL and with code
  26.  * included in the standard release of ns-2 under the Apache 2.0
  27.  * license or under otherwise-compatible licenses with advertising
  28.  * requirements (or modified versions of such code, with unchanged
  29.  * license).  You may copy and distribute such a system following the
  30.  * terms of the GNU GPL for this module and the licenses of the
  31.  * other code concerned, provided that you include the source code of
  32.  * that other code when and as the GNU GPL requires distribution of
  33.  * source code.
  34.  *
  35.  * Note that people who make modified versions of this module
  36.  * are not obligated to grant this special exception for their
  37.  * modified versions; it is their choice whether to do so.  The GNU
  38.  * General Public License gives permission to release a modified
  39.  * version without this exception; this exception also makes it
  40.  * possible to release a modified version which carries forward this
  41.  * exception.
  42.  *
  43.  */
  44. //
  45. // Diffusion-event handler class, Padma, nov 2001. 
  46. #ifdef NS_DIFFUSION
  47. #include "difftimer.h"
  48. #include "diffagent.h"
  49. #include "diffrtg.h"
  50. DiffEvent::DiffEvent(d_handle hdl, void *payload, int time) {
  51. handle_ = hdl;
  52. payload_ = payload;
  53. GetTime(&tv_);
  54. TimevalAddusecs(&tv_, time*1000);
  55. }
  56. void DiffEventQueue::eqAddAfter(d_handle hdl, void *payload, int delay_msec) {
  57. DiffEvent* de;
  58. de = new DiffEvent(hdl, payload, delay_msec);
  59. DiffEventHandler *dh = timerHandler_;
  60. double delay = ((double)delay_msec)/1000;   //convert msec to sec
  61. (void)Scheduler::instance().schedule(dh, de, delay);
  62. scheduler_uid_t uid = ((Event *)de)->uid_;
  63. setUID(hdl, uid);
  64. }
  65. DiffEvent *DiffEventQueue::eqFindEvent(d_handle hdl) {
  66. scheduler_uid_t uid = getUID(hdl);
  67. if (uid != -1) {
  68. Event *p = Scheduler::instance().lookup(uid);
  69. if (p != 0) {
  70. return ((DiffEvent *)p);
  71. } else {
  72. fprintf(stderr, "Error: Can't find event in scheduler queuen");
  73. return NULL;
  74. }
  75. } else {
  76. fprintf(stderr, "Error: Can't find event in uidmap!n");
  77. return NULL;
  78. }
  79. }
  80. bool DiffEventQueue::eqRemove(d_handle hdl) {
  81. // first lookup UID
  82. scheduler_uid_t uid = getUID(hdl);
  83. if (uid != -1) {
  84. // next look for event in scheduler queue
  85. Event *p = Scheduler::instance().lookup(uid);
  86. if (p != 0) {
  87. // remove event from scheduler
  88. Scheduler::instance().cancel(p);
  89. TimerEntry* te = (TimerEntry *)((DiffEvent *)p)->payload();
  90. delete te;
  91. delete p;
  92. return 1;
  93. } else {
  94. fprintf(stderr, "Error: Can't find event in scheduler queuen");
  95. return 0;
  96. }
  97. } else {
  98. fprintf(stderr, "Error: Can't find event in uidmap!n");
  99. return 0;
  100. }
  101. }
  102. // sets value of UID and matching handle into uidmap
  103. void DiffEventQueue::setUID(d_handle hdl, scheduler_uid_t uid) {
  104. MapEntry *me = new MapEntry;
  105. me->hdl_ = hdl;
  106. me->uid_ = uid;
  107. uidmap_.push_back(me);
  108. }
  109. // finds UID for matching handle; removes entry from uidmap and returns uid
  110. scheduler_uid_t DiffEventQueue::getUID(d_handle hdl) {
  111. UIDMap_t::iterator itr;
  112. MapEntry* entry;
  113. for (itr = uidmap_.begin(); itr != uidmap_.end(); ++itr) {
  114. entry = *itr;
  115. if (entry->hdl_ == hdl) { // found handle
  116. // don't need this entry, take it out of list
  117. scheduler_uid_t uid = entry->uid_;
  118. itr = uidmap_.erase(itr);
  119. delete entry;
  120. return uid;
  121. }
  122. }
  123. return (-1);
  124. }
  125. // event handler that gets called at expiry time of event
  126. void DiffEventHandler::handle(Event *e) {
  127. DiffEvent *de = (DiffEvent *)e;
  128. d_handle hdl = de->getHandle();
  129. queue_->getUID(hdl); // only removes entry from uidmap
  130. a_->diffTimeout(de);
  131. }
  132. #endif // NS