ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/event.c
Revision: 4126
Committed: Tue Jul 1 19:24:16 2014 UTC (11 years, 1 month ago) by michael
Content type: text/x-csrc
File size: 2674 byte(s)
Log Message:
- event.c:event_addish(): removed XXX

File Contents

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

Properties

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