summaryrefslogtreecommitdiff
path: root/threads.c
diff options
context:
space:
mode:
authorsvn svn@31f1291d-b8d6-0310-a050-a5561fc1590b <svn svn@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-28 21:59:56 +0000
committersvn svn@31f1291d-b8d6-0310-a050-a5561fc1590b <svn svn@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-28 21:59:56 +0000
commit55bf4dbcabf378e9472b7d31d6edf87f6ac853e9 (patch)
tree7a9454ea6b8750256e242cf6d5fba3ca7a4b5044 /threads.c
Initial Anope Import
git-svn-id: svn://svn.anope.org/anope/trunk@1 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'threads.c')
-rw-r--r--threads.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/threads.c b/threads.c
new file mode 100644
index 000000000..69c9b8fa2
--- /dev/null
+++ b/threads.c
@@ -0,0 +1,82 @@
+/* Threads handling.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: threads.c,v 1.5 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+#ifdef USE_THREADS
+
+/*************************************************************************/
+
+static Thread *threads;
+
+static int thread_cancel(Thread * thr);
+
+/*************************************************************************/
+
+static int thread_cancel(Thread * thr)
+{
+ if (pthread_cancel(thr->th))
+ return 0;
+
+ if (thr->next)
+ thr->next->prev = thr->prev;
+ if (thr->prev)
+ thr->prev->next = thr->next;
+ else
+ threads = thr->next;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+int thread_create(pthread_t * th, void *(*start_routine) (void *),
+ void *arg)
+{
+ Thread *thr;
+
+ if (pthread_create(th, NULL, start_routine, arg))
+ return 0;
+ if (pthread_detach(*th))
+ return 0;
+
+ /* Add the thread to our internal list */
+ thr = scalloc(sizeof(Thread), 1);
+ thr->th = *th;
+ thr->next = threads;
+ if (thr->next)
+ thr->next->prev = thr;
+ threads = thr;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+int thread_killall(void)
+{
+ Thread *thr, *next;
+
+ for (thr = threads; thr; thr = next) {
+ next = thr;
+ if (!thread_cancel(thr))
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+#endif