lib: add job data to to callback
authorVolker Lendecke <vl@samba.org>
Sun, 31 Jul 2016 06:57:35 +0000 (08:57 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 23 Aug 2016 23:33:48 +0000 (01:33 +0200)
The pthreadpool_tevent wrapper will need this

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/lib/pthreadpool/pthreadpool.c
source3/lib/pthreadpool/pthreadpool.h
source3/lib/pthreadpool/pthreadpool_pipe.c
source3/lib/pthreadpool/pthreadpool_sync.c

index 4c2858a0dee6f0961fe3364930387f251703f58a..fc21d43e1a4471954832c2d323bc17f7f0aea563 100644 (file)
@@ -59,8 +59,11 @@ struct pthreadpool {
        /*
         * Indicate job completion
         */
-       int (*signal_fn)(int jobid, void *private_data);
-       void *signal_private_data;
+       int (*signal_fn)(int jobid,
+                        void (*job_fn)(void *private_data),
+                        void *job_fn_private_data,
+                        void *private_data);
+       void *signal_fn_private_data;
 
        /*
         * indicator to worker threads that they should shut down
@@ -100,8 +103,11 @@ static void pthreadpool_prep_atfork(void);
  */
 
 int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
-                    int (*signal_fn)(int jobid, void *private_data),
-                    void *signal_private_data)
+                    int (*signal_fn)(int jobid,
+                                     void (*job_fn)(void *private_data),
+                                     void *job_fn_private_data,
+                                     void *private_data),
+                    void *signal_fn_private_data)
 {
        struct pthreadpool *pool;
        int ret;
@@ -111,7 +117,7 @@ int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
                return ENOMEM;
        }
        pool->signal_fn = signal_fn;
-       pool->signal_private_data = signal_private_data;
+       pool->signal_fn_private_data = signal_fn_private_data;
 
        pool->jobs_array_len = 4;
        pool->jobs = calloc(
@@ -484,7 +490,8 @@ static void *pthreadpool_server(void *arg)
                        assert(res == 0);
 
                        ret = pool->signal_fn(job.id,
-                                             pool->signal_private_data);
+                                             job.fn, job.private_data,
+                                             pool->signal_fn_private_data);
                        if (ret != 0) {
                                pthreadpool_server_exit(pool);
                                pthread_mutex_unlock(&pool->mutex);
index 0b8d6e590c8722038271d58af6e76639101d0069..ee9d9578050bfe7f552dc43d2106fd3d9d174bda 100644 (file)
@@ -44,8 +44,11 @@ struct pthreadpool;
  * care to not overload the system.
  */
 int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
-                    int (*signal_fn)(int jobid, void *private_data),
-                    void *signal_private_data);
+                    int (*signal_fn)(int jobid,
+                                     void (*job_fn)(void *private_data),
+                                     void *job_fn_private_data,
+                                     void *private_data),
+                    void *signal_fn_private_data);
 
 /**
  * @brief Destroy a pthreadpool
index 3eaf5e39bd9d544294040d4a456032fb79130377..f7995abb1405c13b6fdf7d66a7d22f98c509147d 100644 (file)
@@ -28,7 +28,10 @@ struct pthreadpool_pipe {
        int pipe_fds[2];
 };
 
-static int pthreadpool_pipe_signal(int jobid, void *private_data);
+static int pthreadpool_pipe_signal(int jobid,
+                                  void (*job_fn)(void *private_data),
+                                  void *job_private_data,
+                                  void *private_data);
 
 int pthreadpool_pipe_init(unsigned max_threads,
                          struct pthreadpool_pipe **presult)
@@ -62,7 +65,10 @@ int pthreadpool_pipe_init(unsigned max_threads,
        return 0;
 }
 
-static int pthreadpool_pipe_signal(int jobid, void *private_data)
+static int pthreadpool_pipe_signal(int jobid,
+                                  void (*job_fn)(void *private_data),
+                                  void *job_private_data,
+                                  void *private_data)
 {
        struct pthreadpool_pipe *pool = private_data;
        ssize_t written;
index 3e78f467179b1847e3748bf61a315669e60b548e..d9a95f53c611b763eef00e320a2ea3a7bd1552f6 100644 (file)
@@ -26,14 +26,18 @@ struct pthreadpool {
         * Indicate job completion
         */
        int (*signal_fn)(int jobid,
+                        void (*job_fn)(void *private_data),
+                        void *job_fn_private_data,
                         void *private_data);
-       void *signal_private_data;
+       void *signal_fn_private_data;
 };
 
 int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
                     int (*signal_fn)(int jobid,
+                                     void (*job_fn)(void *private_data),
+                                     void *job_fn_private_data,
                                      void *private_data),
-                    void *signal_private_data)
+                    void *signal_fn_private_data)
 {
        struct pthreadpool *pool;
 
@@ -42,7 +46,7 @@ int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
                return ENOMEM;
        }
        pool->signal_fn = signal_fn;
-       pool->signal_private_data = signal_private_data;
+       pool->signal_fn_private_data = signal_fn_private_data;
 
        *presult = pool;
        return 0;
@@ -53,7 +57,8 @@ int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
 {
        fn(private_data);
 
-       return pool->signal_fn(job_id, pool->signal_private_data);
+       return pool->signal_fn(job_id, fn, private_data,
+                              pool->signal_fn_private_data);
 }
 
 int pthreadpool_destroy(struct pthreadpool *pool)