⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.c

📁 -
💻 C
字号:
/* * $Id: event.c,v 1.24.2.1 1999/07/07 01:46:44 wessels Exp $ * * DEBUG: section 41    Event Processing * AUTHOR: Henrik Nordstrom * * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/ * ---------------------------------------------------------- * *  Squid is the result of efforts by numerous individuals from the *  Internet community.  Development is led by Duane Wessels of the *  National Laboratory for Applied Network Research and funded by the *  National Science Foundation.  Squid is Copyrighted (C) 1998 by *  Duane Wessels and the University of California San Diego.  Please *  see the COPYRIGHT file for full details.  Squid incorporates *  software developed and/or copyrighted by other sources.  Please see *  the CREDITS file for full details. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. *   *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. *   *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */#include "squid.h"/* The list of event processes */struct ev_entry {    EVH *func;    void *arg;    const char *name;    double when;    struct ev_entry *next;    int weight;    int id;};static struct ev_entry *tasks = NULL;static OBJH eventDump;static int run_id = 0;voideventAdd(const char *name, EVH * func, void *arg, double when, int weight){    struct ev_entry *event = xcalloc(1, sizeof(struct ev_entry));    struct ev_entry **E;    event->func = func;    event->arg = arg;    event->name = name;    event->when = current_dtime + when;    event->weight = weight;    event->id = run_id;    if (NULL != arg)	cbdataLock(arg);    debug(41, 7) ("eventAdd: Adding '%s', in %f seconds\n", name, when);    /* Insert after the last event with the same or earlier time */    for (E = &tasks; *E; E = &(*E)->next) {	if ((*E)->when > event->when)	    break;    }    event->next = *E;    *E = event;}/* same as eventAdd but adds a random offset within +-1/3 of delta_ish */voideventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int weight){    if (delta_ish >= 3.0) {	const double two_third = (2.0 * delta_ish) / 3.0;	delta_ish = two_third + (drand48() * two_third);	/*	 * I'm sure drand48() isn't portable.  Tell me what function	 * you have that returns a random double value in the range 0,1.	 */    }    eventAdd(name, func, arg, delta_ish, weight);}voideventDelete(EVH * func, void *arg){    struct ev_entry **E;    struct ev_entry *event;    for (E = &tasks; (event = *E) != NULL; E = &(*E)->next) {	if (event->func != func)	    continue;	if (event->arg != arg)	    continue;	*E = event->next;	if (NULL != event->arg)	    cbdataUnlock(event->arg);	xfree(event);	return;    }    debug_trap("eventDelete: event not found");}voideventRun(void){    struct ev_entry *event = NULL;    EVH *func;    void *arg;    int weight = 0;    if (NULL == tasks)	return;    if (tasks->when > current_dtime)	return;    run_id++;    debug(41, 5) ("eventRun: RUN ID %d\n", run_id);    while ((event = tasks)) {	if (event->when > current_dtime)	    break;	if (event->id == run_id)	/* was added during this run */	    break;	if (weight)	    break;	func = event->func;	arg = event->arg;	event->func = NULL;	event->arg = NULL;	tasks = event->next;	if (NULL != arg) {	    int valid = cbdataValid(arg);	    cbdataUnlock(arg);	    if (!valid) {		safe_free(event);		return;	    }	}	weight += event->weight;	debug(41, 5) ("eventRun: Running '%s', id %d\n", event->name, event->id);	func(arg);	safe_free(event);    }}time_teventNextTime(void){    if (!tasks)	return (time_t) 10;    return (time_t) ((tasks->when - current_dtime) * 1000);}voideventInit(void){    cachemgrRegister("events",	"Event Queue",	eventDump, 0, 1);}static voideventDump(StoreEntry * sentry){    struct ev_entry *e = tasks;    storeAppendPrintf(sentry, "%s\t%s\n",	"Operation",	"Next Execution");    while (e != NULL) {	storeAppendPrintf(sentry, "%s\t%f seconds\n",	    e->name, e->when - current_dtime);	e = e->next;    }}voideventFreeMemory(void){    struct ev_entry *event;    while ((event = tasks)) {	if (NULL != event->arg)	    cbdataUnlock(event->arg);	xfree(event);    }    tasks = NULL;}inteventFind(EVH * func, void *arg){    struct ev_entry *event;    for (event = tasks; event != NULL; event = event->next) {	if (event->func == func && event->arg == arg)	    return 1;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -