timer.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1999,2000  Ross Combs (rocombs@cs.nmsu.edu)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (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. #define TIMER_INTERNAL_ACCESS
  19. #include "common/setup_before.h"
  20. #ifdef STDC_HEADERS
  21. # include <stdlib.h>
  22. #else
  23. # ifdef HAVE_MALLOC_H
  24. #  include <malloc.h>
  25. # endif
  26. #endif
  27. #include "common/list.h"
  28. #include "connection.h"
  29. #include "common/eventlog.h"
  30. #include "timer.h"
  31. #include "common/setup_after.h"
  32. static t_list * timerlist_head=NULL;
  33. extern int timerlist_add_timer(t_connection * owner, time_t when, t_timer_cb cb, t_timer_data data)
  34. {
  35.     t_timer * timer;
  36.     
  37.     if (!owner)
  38.     {
  39. eventlog(eventlog_level_error,"timerlist_add_timer","got NULL owner");
  40. return -1;
  41.     }
  42.     
  43.     if (!(timer = malloc(sizeof(t_timer))))
  44.     {
  45. eventlog(eventlog_level_error,"timerlist_add_timer","could not allocate memory for timer");
  46. return -1;
  47.     }
  48.     timer->owner = owner;
  49.     timer->when  = when;
  50.     timer->cb    = cb;
  51.     timer->data  = data;
  52.     
  53.     if (list_prepend_data(timerlist_head,timer)<0)
  54.     {
  55. free(timer);
  56. eventlog(eventlog_level_error,"timerlist_add_timer","could not prepend temp");
  57. return -1;
  58.     }
  59.     
  60.     return 0;
  61. }
  62. extern int timerlist_del_all_timers(t_connection * owner)
  63. {
  64.     t_elem *  curr;
  65.     t_timer * timer;
  66.     
  67.     if (!owner)
  68.     {
  69. eventlog(eventlog_level_error,"timerlist_del_all_timers","got NULL owner");
  70. return -1;
  71.     }
  72.     
  73.     LIST_TRAVERSE(timerlist_head,curr)
  74.     {
  75. timer = elem_get_data(curr);
  76. if (!timer) /* should not happen */
  77. {
  78.     eventlog(eventlog_level_error,"timerlist_del_all_timers","timerlist contains NULL item");
  79.     return -1;
  80. }
  81. if (timer->owner==owner)
  82. {
  83.     if (timer->cb)
  84. timer->cb(timer->owner,(time_t)0,timer->data);
  85.     timer->cb = NULL;
  86.     timer->owner = NULL;
  87.     if (list_remove_elem(timerlist_head,curr)<0)
  88.     {
  89. eventlog(eventlog_level_error,"timerlist_del_all_timers","could not remove timer");
  90. continue;
  91.     }
  92.     free(timer);
  93. }
  94.     }
  95.     
  96.     return 0;
  97. }
  98. extern int timerlist_check_timers(time_t when)
  99. {
  100.     t_elem *  curr;
  101.     t_timer * timer;
  102.     
  103.     LIST_TRAVERSE(timerlist_head,curr)
  104.     {
  105. timer = elem_get_data(curr);
  106. if (!timer) /* should not happen */
  107. {
  108.     eventlog(eventlog_level_error,"timerlist_check_timers","timerlist contains NULL item");
  109.     return -1;
  110. }
  111. if (timer->owner && timer->when<when)
  112. {
  113.     if (timer->cb)
  114. timer->cb(timer->owner,timer->when,timer->data);
  115.     if (list_remove_elem(timerlist_head,curr)<0)
  116.     {
  117. eventlog(eventlog_level_error,"timerlist_check_timers","could not remove timer");
  118. continue;
  119.     }
  120.     free(timer);
  121. }
  122.     }
  123.     
  124.     list_purge(timerlist_head);
  125.     
  126.     return 0;
  127. }
  128. extern int timerlist_create(void)
  129. {
  130.     if (!(timerlist_head = list_create()))
  131. return -1;
  132.     return 0;
  133. }
  134. extern int timerlist_destroy(void)
  135. {
  136.     t_elem *  curr;
  137.     t_timer * timer;
  138.     
  139.     if (timerlist_head)
  140.     {
  141. LIST_TRAVERSE(timerlist_head,curr)
  142. {
  143.     timer = elem_get_data(curr);
  144.     if (!timer) /* should not happen */
  145.     {
  146. eventlog(eventlog_level_error,"timerlist_destroy","timerlist contains NULL item");
  147. continue;
  148.     }
  149.     
  150.     if (list_remove_elem(timerlist_head,curr)<0)
  151.     {
  152. eventlog(eventlog_level_error,"timerlist_destroy","could not remove item from list");
  153. continue;
  154.     }
  155.     free(timer);
  156. }
  157. if (list_destroy(timerlist_head)<0)
  158.     return -1;
  159. timerlist_head = NULL;
  160.     }
  161.     
  162.     return 0;
  163. }