ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/event.c
Revision: 4094
Committed: Sun Jun 29 11:48:50 2014 UTC (11 years, 2 months ago) by michael
Content type: text/x-csrc
File size: 2843 byte(s)
Log Message:
- Merged Adam's event system rewrite

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 "memory.h"
18 #include "log.h"
19 #include "numeric.h"
20 #include "rng_mt.h"
21
22 static dlink_list events;
23
24 void
25 event_add(struct event *ev, void *data)
26 {
27 dlink_node *node;
28
29 event_delete(ev);
30
31 ev->data = data;
32 ev->next = CurrentTime + ev->when;
33 ev->enabled = 1;
34
35 DLINK_FOREACH(node, events.head)
36 {
37 struct event *e = node->data;
38
39 if (e->next > ev->next)
40 {
41 dlinkAddBefore(node, ev, &ev->node, &events);
42 return;
43 }
44 }
45
46 dlinkAddTail(ev, &ev->node, &events);
47 }
48
49 void
50 event_addish(struct event *ev, void *data)
51 {
52 if (ev->when >= 3)
53 {
54 const time_t two_third = (2 * ev->when) / 3;
55 ev->when = two_third + ((genrand_int32() % 1000) * two_third) / 1000;
56 /*
57 * XXX I hate the above magic, I don't even know if its right.
58 * Grr. -- adrian
59 */
60 }
61
62 event_add(ev, data);
63 }
64
65 void
66 event_delete(struct event *ev)
67 {
68 if (!ev->enabled)
69 return;
70
71 dlinkDelete(&ev->node, &events);
72 ev->enabled = 0;
73 }
74
75 void
76 event_run(void)
77 {
78 static time_t last = 0;
79 dlink_node *node = NULL;
80 size_t len = 0;
81
82 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 if (e->when > CurrentTime)
92 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 }
102
103 /*
104 * 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 */
109 void
110 set_back_events(time_t by)
111 {
112 dlink_node *node;
113
114 DLINK_FOREACH(node, events.head)
115 {
116 struct event *ev = node->data;
117 ev->next -= by;
118 }
119 }
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 const dlink_node *node;
132
133 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
138 DLINK_FOREACH(node, events.head)
139 {
140 const struct event *ev = node->data;
141
142 sendto_one_numeric(source_p, &me, RPL_STATSDEBUG|SND_EXPLICIT,
143 "E :%-28s %-4d seconds",
144 ev->name,
145 (int)(ev->next - CurrentTime));
146 }
147 }
148

Properties

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