pthreadpool: Fix starvation after fork
[samba.git] / lib / pthreadpool / pthreadpool_sync.c
1 /*
2  * Unix SMB/CIFS implementation.
3  * sync dummy implementation of the pthreadpool API
4  * Copyright (C) Volker Lendecke 2009
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "replace.h"
22 #include "pthreadpool.h"
23
24 struct pthreadpool {
25         /*
26          * Indicate job completion
27          */
28         int (*signal_fn)(int jobid,
29                          void (*job_fn)(void *private_data),
30                          void *job_fn_private_data,
31                          void *private_data);
32         void *signal_fn_private_data;
33 };
34
35 int pthreadpool_init(unsigned max_threads, struct pthreadpool **presult,
36                      int (*signal_fn)(int jobid,
37                                       void (*job_fn)(void *private_data),
38                                       void *job_fn_private_data,
39                                       void *private_data),
40                      void *signal_fn_private_data)
41 {
42         struct pthreadpool *pool;
43
44         pool = (struct pthreadpool *)calloc(1, sizeof(struct pthreadpool));
45         if (pool == NULL) {
46                 return ENOMEM;
47         }
48         pool->signal_fn = signal_fn;
49         pool->signal_fn_private_data = signal_fn_private_data;
50
51         *presult = pool;
52         return 0;
53 }
54
55 int pthreadpool_add_job(struct pthreadpool *pool, int job_id,
56                         void (*fn)(void *private_data), void *private_data)
57 {
58         fn(private_data);
59
60         return pool->signal_fn(job_id, fn, private_data,
61                                pool->signal_fn_private_data);
62 }
63
64 int pthreadpool_destroy(struct pthreadpool *pool)
65 {
66         free(pool);
67         return 0;
68 }