timer.c
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  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
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19.  
  20. #include "echo.h"
  21. struct Timertask *GTimerhead;
  22. int timer_free ()
  23. {
  24. struct Timertask *pt, *prev;
  25. for (pt=GTimerhead; pt; pt=prev)
  26. {
  27. prev = pt->next;
  28. free (pt);
  29. }
  30. return 0;
  31. }
  32. int timer_add (unsigned int t, TimerFunc process, void *entity, void *data)
  33. {
  34. struct Timertask *pt = calloc (1, sizeof (*pt)), *p, *prevp;
  35. if (pt == NULL)
  36. {
  37. fprintf (stderr, "Allocation failed in %s:%dn", __FILE__, __LINE__);
  38. return -1;
  39. }
  40. pt->time = t;
  41. pt->process = process;
  42. pt->entity = entity;
  43. pt->data = data;
  44. pt->process = process;
  45. if (GTimerhead == NULL || GTimerhead->time >= t)
  46. {
  47. pt->next = GTimerhead;
  48. GTimerhead = pt;
  49. } else
  50. {
  51. for (prevp=NULL,p=GTimerhead; p&&p->time < t; prevp=p,p=p->next);
  52. pt->next = p;
  53. prevp->next = pt;
  54. }
  55. return 0;
  56. }
  57. int timer_process (unsigned int t)
  58. {
  59. struct Timertask *p;
  60. for (p=GTimerhead; p; p=GTimerhead)
  61. {
  62. if (t >= p->time)
  63. {
  64. GTimerhead = p->next;
  65. (*(p->process)) (p->entity, p->data);
  66. free (p);
  67. } else
  68. break;
  69. }
  70. return 0;
  71. }
  72. int timer_remove (void *entity, void *data)
  73. {
  74. struct Timertask *p, *nextp, *prevp;
  75. for (prevp=NULL, p=GTimerhead; p; p=nextp)
  76. {
  77. nextp = p->next;
  78. if (p->entity == entity && p->data == data)
  79. {
  80. if (GTimerhead == p)
  81. GTimerhead = nextp;
  82. else
  83. prevp->next = p->next;
  84. free (p);
  85. } else
  86. prevp = p;
  87. }
  88. return 0;
  89. }
  90. #ifdef __TEST_TIMER
  91. main ()
  92. {
  93. timer_add (0, NULL, 1, 1);
  94. timer_add (10, NULL, 1, 0);
  95. timer_add (5, NULL, 2, 1);
  96. if (GTimerhead->time != 0 || GTimerhead->next->time != 5 || GTimerhead->next->next->time != 10)
  97. assert (0);
  98. timer_remove (2, 1);
  99. if (GTimerhead->time != 0 || GTimerhead->next->time != 10)
  100. assert (0);
  101. timer_remove (1, 1);
  102. if (GTimerhead->time != 10)
  103. assert (0);
  104. timer_remove (1, 0);
  105. if (GTimerhead != NULL)
  106. assert (0);
  107. }
  108. #endif