ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/event.c
Revision: 4099
Committed: Sun Jun 29 17:22:27 2014 UTC (11 years, 2 months ago) by michael
Content type: text/x-csrc
File size: 2843 byte(s)
Log Message:
- event.c: fixed issue in event_run()

File Contents

# User Rev Content
1 adx 30 /*
2     * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3     * event.c: Event functions.
4     *
5 michael 2916 * Copyright (c) 1998-2000 Regents of the University of California
6     * Copyright (c) 2000-2014 ircd-hybrid development team
7 adx 30 *
8 knight 31 * $Id$
9 adx 30 */
10    
11     #include "stdinc.h"
12 michael 1011 #include "list.h"
13 adx 30 #include "ircd.h"
14     #include "event.h"
15     #include "client.h"
16     #include "send.h"
17     #include "memory.h"
18 michael 1309 #include "log.h"
19 adx 30 #include "numeric.h"
20 michael 2680 #include "rng_mt.h"
21 adx 30
22 michael 4094 static dlink_list events;
23 michael 2680
24 michael 4094 void
25     event_add(struct event *ev, void *data)
26     {
27     dlink_node *node;
28 adx 30
29 michael 4094 event_delete(ev);
30 michael 3599
31 michael 4094 ev->data = data;
32     ev->next = CurrentTime + ev->when;
33     ev->enabled = 1;
34 michael 3599
35 michael 4094 DLINK_FOREACH(node, events.head)
36     {
37     struct event *e = node->data;
38 michael 3599
39 michael 4094 if (e->next > ev->next)
40 adx 30 {
41 michael 4094 dlinkAddBefore(node, ev, &ev->node, &events);
42 adx 30 return;
43     }
44     }
45    
46 michael 4094 dlinkAddTail(ev, &ev->node, &events);
47 adx 30 }
48    
49     void
50 michael 4094 event_addish(struct event *ev, void *data)
51 adx 30 {
52 michael 4094 if (ev->when >= 3)
53 adx 30 {
54 michael 4094 const time_t two_third = (2 * ev->when) / 3;
55     ev->when = two_third + ((genrand_int32() % 1000) * two_third) / 1000;
56 adx 30 /*
57     * XXX I hate the above magic, I don't even know if its right.
58     * Grr. -- adrian
59     */
60     }
61    
62 michael 4094 event_add(ev, data);
63 adx 30 }
64    
65     void
66 michael 4094 event_delete(struct event *ev)
67 adx 30 {
68 michael 4094 if (!ev->enabled)
69     return;
70    
71     dlinkDelete(&ev->node, &events);
72     ev->enabled = 0;
73 adx 30 }
74    
75 michael 4094 void
76     event_run(void)
77 adx 30 {
78 michael 4094 static time_t last = 0;
79     dlink_node *node = NULL;
80     size_t len = 0;
81 adx 30
82 michael 4094 if (last == CurrentTime)
83     return;
84     last = CurrentTime;
85    
86     len = dlink_list_length(&events);
87     while (len-- && dlink_list_length(&events))
88     {
89     struct event *e = events.head->data;
90    
91 michael 4099 if (e->next > CurrentTime)
92 michael 4094 break;
93    
94     event_delete(e);
95    
96     e->handler(e->data);
97    
98     if (!e->oneshot)
99     event_add(e, e->data);
100     }
101 adx 30 }
102    
103     /*
104 michael 4094 * void set_back_events(time_t by)
105     * Input: Time to set back events by.
106     * Output: None.
107     * Side-effects: Sets back all events by "by" seconds.
108 adx 30 */
109     void
110 michael 4094 set_back_events(time_t by)
111 adx 30 {
112 michael 4094 dlink_node *node;
113    
114     DLINK_FOREACH(node, events.head)
115     {
116     struct event *ev = node->data;
117     ev->next -= by;
118     }
119 adx 30 }
120    
121     /*
122     * void show_events(struct Client *source_p)
123     *
124     * Input: Client requesting the event
125     * Output: List of events
126     * Side Effects: None
127     */
128     void
129     show_events(struct Client *source_p)
130     {
131 michael 4094 const dlink_node *node;
132 adx 30
133 michael 3589 sendto_one_numeric(source_p, &me, RPL_STATSDEBUG|SND_EXPLICIT,
134     "E :Operation Next Execution");
135     sendto_one_numeric(source_p, &me, RPL_STATSDEBUG|SND_EXPLICIT,
136     "E :-------------------------------------------");
137 adx 30
138 michael 4094 DLINK_FOREACH(node, events.head)
139     {
140     const struct event *ev = node->data;
141 adx 30
142 michael 4094 sendto_one_numeric(source_p, &me, RPL_STATSDEBUG|SND_EXPLICIT,
143     "E :%-28s %-4d seconds",
144     ev->name,
145     (int)(ev->next - CurrentTime));
146 adx 30 }
147     }
148 michael 4094

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision