summaryrefslogtreecommitdiff
path: root/threads.c
diff options
context:
space:
mode:
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