From: Pierre Habouzit Date: Sun, 2 Dec 2007 21:27:28 +0000 (+0100) Subject: Threads are just such a bad idea… X-Git-Url: http://git.madism.org/?a=commitdiff_plain;h=52534a99b8e1644411383e8406519add7984cee9;p=apps%2Fpfixtools.git Threads are just such a bad idea… Signed-off-by: Pierre Habouzit --- diff --git a/Makefile b/Makefile index a0f9786..40894b5 100644 --- a/Makefile +++ b/Makefile @@ -45,10 +45,10 @@ TESTS = tst-rbl GENERATED = tokens.h tokens.c -lib_SOURCES = threads.c str.c buffer.c common.c epoll.c $(GENERATED) +lib_SOURCES = str.c buffer.c common.c epoll.c $(GENERATED) postlicyd_SOURCES = greylist.c rbl.c main-postlicyd.c lib.a -postlicyd_LIBADD = -lpthread $(TC_LIBS) +postlicyd_LIBADD = $(TC_LIBS) pfix-srsd_SOURCES = main-srsd.c lib.a pfix-srsd_LIBADD = -lsrs2 diff --git a/main-postlicyd.c b/main-postlicyd.c index 7a5630e..1e1ce4d 100644 --- a/main-postlicyd.c +++ b/main-postlicyd.c @@ -38,7 +38,6 @@ #include "buffer.h" #include "common.h" #include "epoll.h" -#include "threads.h" #include "tokens.h" #define DAEMON_NAME "postlicyd" diff --git a/threads.c b/threads.c deleted file mode 100644 index 16d0518..0000000 --- a/threads.c +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************/ -/* pfixtools: a collection of postfix related tools */ -/* ~~~~~~~~~ */ -/* ________________________________________________________________________ */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* 1. Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* 2. Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* 3. The names of its contributors may not be used to endorse or promote */ -/* products derived from this software without specific prior written */ -/* permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND */ -/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE */ -/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ -/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ -/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ -/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ -/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ -/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ -/* THE POSSIBILITY OF SUCH DAMAGE. */ -/******************************************************************************/ - -/* - * Copyright © 2007 Pierre Habouzit - */ - -#include "threads.h" - -static struct { - pthread_spinlock_t spin; - pthread_t *deads; - int count, size; -} morgue; - -struct job_closure { - void *(*f)(int, void*); - int fd; - void *data; -}; - -void thread_register_dead(void *tid) -{ - pthread_spin_lock(&morgue.spin); - if (morgue.count >= morgue.size) { - p_allocgrow(&morgue.deads, morgue.count + 1, &morgue.size); - } - morgue.deads[morgue.count++] = (pthread_t)tid; - pthread_spin_unlock(&morgue.spin); -} - -static void *thread_wrapper(void *arg) -{ - struct job_closure *closure = arg; - void *res; - - pthread_cleanup_push(thread_register_dead, (void *)pthread_self()); - res = (*closure->f)(closure->fd, closure->data); - pthread_cleanup_pop(1); - p_delete(&closure); - return res; -} - -int thread_launch(void *(*f)(int, void *), int fd, void *data) -{ - struct job_closure closure = { .f = f, .fd = fd, .data = data }; - pthread_t t; - return pthread_create(&t, NULL, &thread_wrapper, p_dup(&closure, 1)); -} - -void threads_join(void) -{ - if (!morgue.count) - return; - - pthread_spin_lock(&morgue.spin); - while (morgue.count-- > 0) { - pthread_join(morgue.deads[morgue.count], NULL); - } - pthread_spin_unlock(&morgue.spin); -} - - -static int threads_initialize(void) -{ - pthread_spin_init(&morgue.spin, PTHREAD_PROCESS_PRIVATE); - return 0; -} - -static void threads_shutdown(void) -{ - pthread_spin_destroy(&morgue.spin); -} - -module_init(threads_initialize); -module_exit(threads_shutdown); diff --git a/threads.h b/threads.h deleted file mode 100644 index 58a0731..0000000 --- a/threads.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************/ -/* pfixtools: a collection of postfix related tools */ -/* ~~~~~~~~~ */ -/* ________________________________________________________________________ */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* 1. Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* 2. Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* 3. The names of its contributors may not be used to endorse or promote */ -/* products derived from this software without specific prior written */ -/* permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND */ -/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE */ -/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ -/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ -/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ -/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ -/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ -/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ -/* THE POSSIBILITY OF SUCH DAMAGE. */ -/******************************************************************************/ - -/* - * Copyright © 2007 Pierre Habouzit - */ - -#ifndef PFIXTOOLS_THREADS_H -#define PFIXTOOLS_THREADS_H - -#include "common.h" -#include - -int thread_launch(void *(*f)(int fd, void *), int fd, void *); -void threads_join(void); - -#endif