lib: Add pthreadpool_pipe
authorVolker Lendecke <vl@samba.org>
Sat, 30 Jul 2016 08:20:08 +0000 (10:20 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 23 Aug 2016 23:33:48 +0000 (01:33 +0200)
First step to separate the signalling mechanism from the core pthreadpool code.
A later patch will add a pthreadpool that directly indicates job completion via
tevent_threaded_schedule_immediate.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/lib/pthreadpool/pthreadpool_pipe.c [new file with mode: 0644]
source3/lib/pthreadpool/pthreadpool_pipe.h [new file with mode: 0644]
source3/lib/pthreadpool/wscript_build

diff --git a/source3/lib/pthreadpool/pthreadpool_pipe.c b/source3/lib/pthreadpool/pthreadpool_pipe.c
new file mode 100644 (file)
index 0000000..76bafa2
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * threadpool implementation based on pthreads
+ * Copyright (C) Volker Lendecke 2009,2011
+ *
+ * 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 "replace.h"
+#include "system/filesys.h"
+#include "pthreadpool_pipe.h"
+#include "pthreadpool.h"
+
+struct pthreadpool_pipe {
+       struct pthreadpool *pool;
+};
+
+int pthreadpool_pipe_init(unsigned max_threads,
+                         struct pthreadpool_pipe **presult)
+{
+       struct pthreadpool_pipe *p;
+       int ret;
+
+       p = malloc(sizeof(struct pthreadpool_pipe));
+       if (p == NULL) {
+               return ENOMEM;
+       }
+
+       ret = pthreadpool_init(max_threads, &p->pool);
+       if (ret != 0) {
+               free(p);
+               return ret;
+       }
+
+       *presult = p;
+       return 0;
+}
+
+int pthreadpool_pipe_destroy(struct pthreadpool_pipe *pool)
+{
+       int ret;
+
+       ret = pthreadpool_destroy(pool->pool);
+       if (ret != 0) {
+               return ret;
+       }
+       free(pool);
+       return 0;
+}
+
+int pthreadpool_pipe_add_job(struct pthreadpool_pipe *pool, int job_id,
+                            void (*fn)(void *private_data),
+                            void *private_data)
+{
+       int ret;
+       ret = pthreadpool_add_job(pool->pool, job_id, fn, private_data);
+       return ret;
+}
+
+int pthreadpool_pipe_signal_fd(struct pthreadpool_pipe *pool)
+{
+       int fd;
+       fd = pthreadpool_signal_fd(pool->pool);
+       return fd;
+}
+
+int pthreadpool_pipe_finished_jobs(struct pthreadpool_pipe *pool, int *jobids,
+                                  unsigned num_jobids)
+{
+       int ret;
+       ret = pthreadpool_finished_jobs(pool->pool, jobids, num_jobids);
+       return ret;
+}
diff --git a/source3/lib/pthreadpool/pthreadpool_pipe.h b/source3/lib/pthreadpool/pthreadpool_pipe.h
new file mode 100644 (file)
index 0000000..77516f7
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * threadpool implementation based on pthreads
+ * Copyright (C) Volker Lendecke 2009,2011
+ *
+ * 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/>.
+ */
+
+#ifndef __PTHREADPOOL_PIPE_H__
+#define __PTHREADPOOL_PIPE_H__
+
+struct pthreadpool_pipe;
+
+int pthreadpool_pipe_init(unsigned max_threads,
+                         struct pthreadpool_pipe **presult);
+
+int pthreadpool_pipe_destroy(struct pthreadpool_pipe *pool);
+
+int pthreadpool_pipe_add_job(struct pthreadpool_pipe *pool, int job_id,
+                            void (*fn)(void *private_data),
+                            void *private_data);
+
+int pthreadpool_pipe_signal_fd(struct pthreadpool_pipe *pool);
+
+int pthreadpool_pipe_finished_jobs(struct pthreadpool_pipe *pool, int *jobids,
+                                  unsigned num_jobids);
+
+#endif
index bdd5f53dcf741737ae410f563a198b5a784addac..aa02850ea303d6bbdb5a2bf352c7a5ce74e440dd 100644 (file)
@@ -2,11 +2,11 @@
 
 if bld.env.WITH_PTHREADPOOL:
     bld.SAMBA3_SUBSYSTEM('PTHREADPOOL',
-                         source='pthreadpool.c',
+                         source='pthreadpool.c pthreadpool_pipe.c',
                          deps='pthread rt replace')
 else:
     bld.SAMBA3_SUBSYSTEM('PTHREADPOOL',
-                         source='pthreadpool_sync.c',
+                         source='pthreadpool_sync.c pthreadpool_pipe.c',
                          deps='replace')