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

通讯编程

开发平台:

Visual C++

  1. //
  2. // timers.hh       : Timer Management Include File
  3. // authors         : John Heidemann, Fabio Silva and Alefiya Hussain
  4. //
  5. // Copyright (C) 2000-2002 by the University of Southern California
  6. // $Id: timers.hh,v 1.4 2005/09/13 04:53:50 tomh Exp $
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License,
  10. // version 2, as published by the Free Software Foundation.
  11. //
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. //
  17. // You should have received a copy of the GNU General Public License along
  18. // with this program; if not, write to the Free Software Foundation, Inc.,
  19. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20. //
  21. // Linking this file statically or dynamically with other modules is making
  22. // a combined work based on this file.  Thus, the terms and conditions of
  23. // the GNU General Public License cover the whole combination.
  24. //
  25. // In addition, as a special exception, the copyright holders of this file
  26. // give you permission to combine this file with free software programs or
  27. // libraries that are released under the GNU LGPL and with code included in
  28. // the standard release of ns-2 under the Apache 2.0 license or under
  29. // otherwise-compatible licenses with advertising requirements (or modified
  30. // versions of such code, with unchanged license).  You may copy and
  31. // distribute such a system following the terms of the GNU GPL for this
  32. // file and the licenses of the other code concerned, provided that you
  33. // include the source code of that other code when and as the GNU GPL
  34. // requires distribution of source code.
  35. //
  36. // Note that people who make modified versions of this file are not
  37. // obligated to grant this special exception for their modified versions;
  38. // it is their choice whether to do so.  The GNU General Public License
  39. // gives permission to release a modified version without this exception;
  40. // this exception also makes it possible to release a modified version
  41. // which carries forward this exception.
  42. #ifndef _TIMERS_H_
  43. #define _TIMERS_H_
  44. #ifdef HAVE_CONFIG_H
  45. #include "config.h"
  46. #endif // HAVE_CONFIG_H
  47. #ifdef USE_THREADS
  48. #include <pthread.h>
  49. #endif // USE_THREADS
  50. #include <string.h>
  51. #include "events.hh"
  52. #ifdef NS_DIFFUSION
  53. class TimerManager;
  54. class DiffEvent;
  55. class DiffEventHandler;
  56. #include "difftimer.h"
  57. #endif // NS_DIFFUSION
  58. //
  59. // To make a new timer, subclass TimerCallback and override the
  60. // expire() method.
  61. //
  62. // If you need to pass parameters to your timer, pass them in the
  63. // constructor of your subclass.
  64. //
  65. // If you allocate data in your callback, free it in the destructor.
  66. //
  67. // When the timer fires, expire() will be called.  You can do anything
  68. // you want there.  When you're done, return a value that indicates
  69. // what happens to the timer:
  70. //
  71. // return = 0   re-add timer again to queue with same timeout as last time
  72. //        > 0   re-add timer to queue with new timeout given by return value
  73. //        < 0   discard timer (do not re-add it to the queue)
  74. //
  75. class TimerCallback {
  76. public:
  77.   TimerCallback() {};
  78.   virtual ~TimerCallback() {};
  79.   virtual int expire() = 0;
  80. };
  81. // This class is used to define a timer in the event queue. The
  82. // timeout provided should be in milliseconds. cb specifies the
  83. // function that will be called.
  84. class TimerEntry {
  85. public:
  86.   handle hdl_;
  87.   int timeout_;
  88.   TimerCallback *cb_;
  89.   TimerEntry(handle hdl, int timeout,TimerCallback *cb) : 
  90.     hdl_(hdl), timeout_(timeout), cb_(cb) {};
  91.   ~TimerEntry() {};
  92. };
  93. // Creates the Timer Management class. Creates the eventqueue
  94. // The eventqueue is used by the Timer class only. 
  95. // Use the NextTimerTime and ExecuteNextTimer functions to access
  96. // the event queue
  97. class TimerManager {
  98. public:
  99.   TimerManager();
  100.   ~TimerManager() {};
  101.   // Timer API functions:
  102.   // add a timer to the queue, returning the handle that can be used
  103.   // to cancel it with removeTimer timeout value deifne in ms.  When
  104.   // the timer fires, expire() will be called.  You can do anything
  105.   // you want there.  When you're done, return a value that indicates
  106.   // what happens to the timer:
  107.   //
  108.   // return = 0   re-add timer again to queue with same timeout as last time
  109.   //        > 0   re-add timer to queue with new timeout given by return value
  110.   //        < 0   discard timer (do not re-add it to the queue)
  111.   handle addTimer(int timeout, TimerCallback *cb);
  112.   // remove a timer that's scheduled, returns if it was there.
  113.   bool removeTimer(handle hdl);
  114.   // returns the timer value at head of the queue
  115.   void nextTimerTime(struct timeval *tv);
  116.   // Executes the timer on the head of the queue
  117. #ifdef NS_DIFFUSION
  118.   void diffTimeout(DiffEvent *e);
  119. #else
  120.   void executeNextTimer();
  121.   void executeAllExpiredTimers();
  122. #endif // NS_DIFFUSION
  123. protected:
  124.   int next_handle_; // counter of handle ids
  125.   EventQueue *eq_;  // internal list of timers
  126. #ifdef USE_THREADS
  127.   pthread_mutex_t *queue_mtx_;
  128. #endif // USE_THREADS
  129. };
  130. #endif // _TIMERS_H_