summaryrefslogtreecommitdiff
path: root/src/timeout.c
diff options
context:
space:
mode:
authorsjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
committersjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
commitc777c8d9aa7cd5c2e9a399727a7fa9985a77fb1c (patch)
tree9e996ae4a1bbb833cec036c5cd4d87a590149e85 /src/timeout.c
Anope Stable Branch
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/stable@1902 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/timeout.c')
-rw-r--r--src/timeout.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/timeout.c b/src/timeout.c
new file mode 100644
index 000000000..1db734654
--- /dev/null
+++ b/src/timeout.c
@@ -0,0 +1,132 @@
+/* Routines for time-delayed actions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+static Timeout *timeouts = NULL;
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+/* Send the timeout list to the given user. */
+
+int send_timeout_list(User * u)
+{
+ Timeout *to, *last;
+
+ notice(s_OperServ, u->nick, "Now: %ld", (long int) time(NULL));
+ for (to = timeouts, last = NULL; to; last = to, to = to->next) {
+ notice(s_OperServ, u->nick, "0x%p: %ld: 0x%p (0x%p)",
+ (void *) to, (long int) to->timeout, (void *) to->code,
+ (void *) to->data);
+ if (to->prev != last)
+ notice(s_OperServ, u->nick,
+ " to->prev incorrect! expected=0x%p seen=0x%p",
+ (void *) last, (void *) to->prev);
+ }
+ return MOD_CONT;
+}
+
+#endif /* DEBUG_COMMANDS */
+
+/*************************************************************************/
+
+/* Check the timeout list for any pending actions. */
+
+void check_timeouts(void)
+{
+ Timeout *to, *to2;
+ time_t t = time(NULL);
+
+ if (debug >= 2)
+ alog("debug: Checking timeouts at %ld", (long int) t);
+
+ to = timeouts;
+ while (to) {
+ if (t < to->timeout) {
+ to = to->next;
+ continue;
+ }
+ if (debug >= 4) {
+ alog("debug: Running timeout 0x%p (code=0x%p repeat=%d)",
+ (void *) to, (void *) to->code, to->repeat);
+ }
+ to->code(to);
+ if (to->repeat) {
+ to = to->next;
+ continue;
+ }
+ to2 = to->next;
+ if (to->next)
+ to->next->prev = to->prev;
+ if (to->prev)
+ to->prev->next = to->next;
+ else
+ timeouts = to->next;
+ free(to);
+ to = to2;
+ }
+ if (debug >= 2)
+ alog("debug: Finished timeout list");
+}
+
+/*************************************************************************/
+
+/* Add a timeout to the list to be triggered in `delay' seconds. If
+ * `repeat' is nonzero, do not delete the timeout after it is triggered.
+ * This must maintain the property that timeouts added from within a
+ * timeout routine do not get checked during that run of the timeout list.
+ */
+
+Timeout *add_timeout(int delay, void (*code) (Timeout *), int repeat)
+{
+ Timeout *t = scalloc(sizeof(Timeout), 1);
+ t->settime = time(NULL);
+ t->timeout = t->settime + delay;
+ t->code = code;
+ t->repeat = repeat;
+ t->next = timeouts;
+ t->prev = NULL;
+ if (timeouts)
+ timeouts->prev = t;
+ timeouts = t;
+ return t;
+}
+
+/*************************************************************************/
+
+/* Remove a timeout from the list (if it's there). */
+
+void del_timeout(Timeout * t)
+{
+ Timeout *ptr;
+
+ for (ptr = timeouts; ptr; ptr = ptr->next) {
+ if (ptr == t)
+ break;
+ }
+ if (!ptr)
+ return;
+ if (t->prev)
+ t->prev->next = t->next;
+ else
+ timeouts = t->next;
+ if (t->next)
+ t->next->prev = t->prev;
+ free(t);
+}
+
+/*************************************************************************/