event.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: event.c,v 1.24 1998/12/02 05:03:28 wessels Exp $
  3.  *
  4.  * DEBUG: section 41    Event Processing
  5.  * AUTHOR: Henrik Nordstrom
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. /* The list of event processes */
  36. struct ev_entry {
  37.     EVH *func;
  38.     void *arg;
  39.     const char *name;
  40.     double when;
  41.     struct ev_entry *next;
  42.     int weight;
  43.     int id;
  44. };
  45. static struct ev_entry *tasks = NULL;
  46. static OBJH eventDump;
  47. static int run_id = 0;
  48. void
  49. eventAdd(const char *name, EVH * func, void *arg, double when, int weight)
  50. {
  51.     struct ev_entry *event = xcalloc(1, sizeof(struct ev_entry));
  52.     struct ev_entry **E;
  53.     event->func = func;
  54.     event->arg = arg;
  55.     event->name = name;
  56.     event->when = current_dtime + when;
  57.     event->weight = weight;
  58.     event->id = run_id;
  59.     if (NULL != arg)
  60. cbdataLock(arg);
  61.     debug(41, 7) ("eventAdd: Adding '%s', in %f secondsn", name, when);
  62.     /* Insert after the last event with the same or earlier time */
  63.     for (E = &tasks; *E; E = &(*E)->next) {
  64. if ((*E)->when > event->when)
  65.     break;
  66.     }
  67.     event->next = *E;
  68.     *E = event;
  69. }
  70. /* same as eventAdd but adds a random offset within +-1/3 of delta_ish */
  71. void
  72. eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int weight)
  73. {
  74.     if (delta_ish >= 3.0) {
  75. const double two_third = (2.0 * delta_ish) / 3.0;
  76. delta_ish = two_third + (drand48() * two_third);
  77. /*
  78.  * I'm sure drand48() isn't portable.  Tell me what function
  79.  * you have that returns a random double value in the range 0,1.
  80.  */
  81.     }
  82.     eventAdd(name, func, arg, delta_ish, weight);
  83. }
  84. void
  85. eventDelete(EVH * func, void *arg)
  86. {
  87.     struct ev_entry **E;
  88.     struct ev_entry *event;
  89.     for (E = &tasks; (event = *E) != NULL; E = &(*E)->next) {
  90. if (event->func != func)
  91.     continue;
  92. if (event->arg != arg)
  93.     continue;
  94. *E = event->next;
  95. if (NULL != event->arg)
  96.     cbdataUnlock(event->arg);
  97. xfree(event);
  98. return;
  99.     }
  100.     debug_trap("eventDelete: event not found");
  101. }
  102. void
  103. eventRun(void)
  104. {
  105.     struct ev_entry *event = NULL;
  106.     EVH *func;
  107.     void *arg;
  108.     int weight = 0;
  109.     if (NULL == tasks)
  110. return;
  111.     if (tasks->when > current_dtime)
  112. return;
  113.     run_id++;
  114.     debug(41, 5) ("eventRun: RUN ID %dn", run_id);
  115.     while ((event = tasks)) {
  116. if (event->when > current_dtime)
  117.     break;
  118. if (event->id == run_id) /* was added during this run */
  119.     break;
  120. if (weight)
  121.     break;
  122. func = event->func;
  123. arg = event->arg;
  124. event->func = NULL;
  125. event->arg = NULL;
  126. tasks = event->next;
  127. if (NULL != arg) {
  128.     int valid = cbdataValid(arg);
  129.     cbdataUnlock(arg);
  130.     if (!valid)
  131. return;
  132. }
  133. weight += event->weight;
  134. debug(41, 5) ("eventRun: Running '%s', id %dn", event->name, event->id);
  135. func(arg);
  136. safe_free(event);
  137.     }
  138. }
  139. time_t
  140. eventNextTime(void)
  141. {
  142.     if (!tasks)
  143. return (time_t) 10;
  144.     return (time_t) ((tasks->when - current_dtime) * 1000);
  145. }
  146. void
  147. eventInit(void)
  148. {
  149.     cachemgrRegister("events",
  150. "Event Queue",
  151. eventDump, 0, 1);
  152. }
  153. static void
  154. eventDump(StoreEntry * sentry)
  155. {
  156.     struct ev_entry *e = tasks;
  157.     storeAppendPrintf(sentry, "%st%sn",
  158. "Operation",
  159. "Next Execution");
  160.     while (e != NULL) {
  161. storeAppendPrintf(sentry, "%st%f secondsn",
  162.     e->name, e->when - current_dtime);
  163. e = e->next;
  164.     }
  165. }
  166. void
  167. eventFreeMemory(void)
  168. {
  169.     struct ev_entry *event;
  170.     while ((event = tasks)) {
  171. if (NULL != event->arg)
  172.     cbdataUnlock(event->arg);
  173. xfree(event);
  174.     }
  175.     tasks = NULL;
  176. }
  177. int
  178. eventFind(EVH * func, void *arg)
  179. {
  180.     struct ev_entry *event;
  181.     for (event = tasks; event != NULL; event = event->next) {
  182. if (event->func == func && event->arg == arg)
  183.     return 1;
  184.     }
  185.     return 0;
  186. }