s3: Add a dummy implementation for the pthreadpool API
authorVolker Lendecke <vl@samba.org>
Wed, 13 Jun 2012 11:05:17 +0000 (13:05 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 19 Jun 2012 17:27:24 +0000 (10:27 -0700)
Signed-off-by: Jeremy Allison <jra@samba.org>
source3/configure.in
source3/lib/pthreadpool/pthreadpool_sync.c [new file with mode: 0644]
source3/lib/pthreadpool/wscript_build

index c5775f810c568bffa7a24cff1c3857bf87630859..4c2a3620d0c6a27aec69d8f21ec648153f261481 100644 (file)
@@ -6172,15 +6172,18 @@ fi
 if test x"$enable_pthreadpool" = x"yes" -a x"$samba_cv_HAVE_PTHREAD" = x"yes"; then
     LIBS="$LIBS $PTHREAD_LDFLAGS"
     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-    AC_DEFINE(WITH_PTHREADPOOL, 1, [Whether to include pthreadpool helpers])
     AC_SUBST(PTHREADPOOL_OBJ, "lib/pthreadpool/pthreadpool.o")
-    PTHREADPOOLTEST="bin/pthreadpooltest"
-    AC_SUBST(PTHREADPOOLTEST)
     if test x"$samba_cv_HAVE_AIO" = x"yes"; then
         default_shared_modules="$default_shared_modules vfs_aio_pthread"
     fi
+else
+    AC_SUBST(PTHREADPOOL_OBJ, "lib/pthreadpool/pthreadpool_sync.o")
 fi
 
+AC_DEFINE(WITH_PTHREADPOOL, 1, [Whether to include pthreadpool helpers])
+PTHREADPOOLTEST="bin/pthreadpooltest"
+AC_SUBST(PTHREADPOOLTEST)
+
 
 #################################################
 # Check to see if we should use the included iniparser
diff --git a/source3/lib/pthreadpool/pthreadpool_sync.c b/source3/lib/pthreadpool/pthreadpool_sync.c
new file mode 100644 (file)
index 0000000..6c18b8f
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * sync dummy implementation of the pthreadpool API
+ * Copyright (C) Volker Lendecke 2009
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <signal.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <sys/time.h>
+
+#include "pthreadpool.h"
+
+struct pthreadpool {
+       /*
+        * pipe for signalling
+        */
+       int sig_pipe[2];
+
+       /*
+        * Have we sent something into the pipe that has not been
+        * retrieved yet?
+        */
+       int pipe_busy;
+
+       /*
+        * Jobids that we have not sent into the pipe yet
+        */
+       size_t num_ids;
+       int *ids;
+};
+
+int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult)
+{
+       struct pthreadpool *pool;
+       int ret;
+
+       pool = (struct pthreadpool *)calloc(1, sizeof(struct pthreadpool));
+       if (pool == NULL) {
+               return ENOMEM;
+       }
+       ret = pipe(pool->sig_pipe);
+       if (ret == -1) {
+               int err = errno;
+               free(pool);
+               return err;
+       }
+       *presult = pool;
+       return 0;
+}
+
+int pthreadpool_signal_fd(struct pthreadpool *pool)
+{
+       return pool->sig_pipe[0];
+}
+
+static int pthreadpool_write_to_pipe(struct pthreadpool *pool)
+{
+       ssize_t written;
+
+       if (pool->pipe_busy) {
+               return 0;
+       }
+       if (pool->num_ids == 0) {
+               return 0;
+       }
+
+       written = -1;
+       errno = EINTR;
+
+       while ((written == -1) && (errno == EINTR)) {
+               written = write(pool->sig_pipe[1], &pool->ids[0], sizeof(int));
+       }
+       if (written == -1) {
+               return errno;
+       }
+       if (written != sizeof(int)) {
+               /*
+                * If a single int only partially fits into the pipe,
+                * we can assume ourselves pretty broken
+                */
+               close(pool->sig_pipe[1]);
+               pool->sig_pipe[1] = -1;
+               return EIO;
+       }
+
+       if (pool->num_ids > 1) {
+               memmove(pool->ids, pool->ids+1, sizeof(int) * (pool->num_ids-1));
+       }
+       pool->num_ids -= 1;
+       pool->pipe_busy = 1;
+       return 0;
+}
+
+int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
+                       void (*fn)(void *private_data), void *private_data)
+{
+       int *tmp;
+
+       if (pool->sig_pipe[1] == -1) {
+               return EIO;
+       }
+
+       fn(private_data);
+
+       tmp = realloc(pool->ids, sizeof(int) * (pool->num_ids+1));
+       if (tmp == NULL) {
+               return ENOMEM;
+       }
+       pool->ids = tmp;
+       pool->ids[pool->num_ids] = job_id;
+       pool->num_ids += 1;
+
+       return pthreadpool_write_to_pipe(pool);
+
+}
+
+int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid)
+{
+       int ret_jobid;
+       ssize_t nread;
+
+       nread = -1;
+       errno = EINTR;
+
+       while ((nread == -1) && (errno == EINTR)) {
+               nread = read(pool->sig_pipe[0], &ret_jobid, sizeof(int));
+       }
+       if (nread == -1) {
+               return errno;
+       }
+       if (nread != sizeof(int)) {
+               return EINVAL;
+       }
+       *jobid = ret_jobid;
+
+       pool->pipe_busy = 0;
+       return pthreadpool_write_to_pipe(pool);
+}
+
+int pthreadpool_destroy(struct pthreadpool *pool)
+{
+       if (pool->sig_pipe[0] != -1) {
+               close(pool->sig_pipe[0]);
+               pool->sig_pipe[0] = -1;
+       }
+
+       if (pool->sig_pipe[1] != -1) {
+               close(pool->sig_pipe[1]);
+               pool->sig_pipe[1] = -1;
+       }
+       free(pool->ids);
+       free(pool);
+       return 0;
+}
index 5488c3a5eab5616f8054c6533fb9b1e103e10abb..2cdd2ab312c7a927e0af3d76a375b9ee5d466057 100644 (file)
@@ -1,9 +1,14 @@
 #!/usr/bin/env python
 
-bld.SAMBA3_SUBSYSTEM('PTHREADPOOL',
-                     source='pthreadpool.c',
-                     deps='pthread rt replace',
-                     enabled=bld.env.WITH_PTHREADPOOL)
+if bld.env.WITH_PTHREADPOOL:
+    bld.SAMBA3_SUBSYSTEM('PTHREADPOOL',
+                         source='pthreadpool.c',
+                         deps='pthread rt replace')
+else:
+    bld.SAMBA3_SUBSYSTEM('PTHREADPOOL',
+                         source='pthreadpool_sync.c',
+                         deps='replace')
+
 
 bld.SAMBA3_BINARY('pthreadpooltest',
                   source='tests.c',