66#include <time.h>
77
88#include "fpm_config.h"
9+ #include "fpm_children.h"
910#include "fpm_scoreboard.h"
1011#include "fpm_shm.h"
1112#include "fpm_sockets.h"
@@ -23,7 +24,6 @@ static float fpm_scoreboard_tick;
2324int fpm_scoreboard_init_main () /* {{{ */
2425{
2526 struct fpm_worker_pool_s * wp ;
26- unsigned int i ;
2727
2828#ifdef HAVE_TIMES
2929#if (defined(HAVE_SYSCONF ) && defined(_SC_CLK_TCK ))
@@ -40,7 +40,7 @@ int fpm_scoreboard_init_main() /* {{{ */
4040
4141
4242 for (wp = fpm_worker_all_pools ; wp ; wp = wp -> next ) {
43- size_t scoreboard_size , scoreboard_nprocs_size ;
43+ size_t scoreboard_procs_size ;
4444 void * shm_mem ;
4545
4646 if (wp -> config -> pm_max_children < 1 ) {
@@ -53,22 +53,15 @@ int fpm_scoreboard_init_main() /* {{{ */
5353 return -1 ;
5454 }
5555
56- scoreboard_size = sizeof (struct fpm_scoreboard_s ) + (wp -> config -> pm_max_children ) * sizeof (struct fpm_scoreboard_proc_s * );
57- scoreboard_nprocs_size = sizeof (struct fpm_scoreboard_proc_s ) * wp -> config -> pm_max_children ;
58- shm_mem = fpm_shm_alloc (scoreboard_size + scoreboard_nprocs_size );
56+ scoreboard_procs_size = sizeof (struct fpm_scoreboard_proc_s ) * wp -> config -> pm_max_children ;
57+ shm_mem = fpm_shm_alloc (sizeof (struct fpm_scoreboard_s ) + scoreboard_procs_size );
5958
6059 if (!shm_mem ) {
6160 return -1 ;
6261 }
63- wp -> scoreboard = shm_mem ;
62+ wp -> scoreboard = shm_mem ;
63+ wp -> scoreboard -> pm = wp -> config -> pm ;
6464 wp -> scoreboard -> nprocs = wp -> config -> pm_max_children ;
65- shm_mem += scoreboard_size ;
66-
67- for (i = 0 ; i < wp -> scoreboard -> nprocs ; i ++ , shm_mem += sizeof (struct fpm_scoreboard_proc_s )) {
68- wp -> scoreboard -> procs [i ] = shm_mem ;
69- }
70-
71- wp -> scoreboard -> pm = wp -> config -> pm ;
7265 wp -> scoreboard -> start_epoch = time (NULL );
7366 strlcpy (wp -> scoreboard -> pool , wp -> config -> name , sizeof (wp -> scoreboard -> pool ));
7467 }
@@ -162,28 +155,48 @@ struct fpm_scoreboard_s *fpm_scoreboard_get() /* {{{*/
162155}
163156/* }}} */
164157
165- struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get (struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{*/
158+ static inline struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get_ex (
159+ struct fpm_scoreboard_s * scoreboard , int child_index , unsigned int nprocs ) /* {{{*/
166160{
167161 if (!scoreboard ) {
168- scoreboard = fpm_scoreboard ;
162+ return NULL ;
169163 }
170164
171- if (! scoreboard ) {
165+ if (child_index < 0 || ( unsigned int ) child_index >= nprocs ) {
172166 return NULL ;
173167 }
174168
169+ return & scoreboard -> procs [child_index ];
170+ }
171+ /* }}} */
172+
173+ struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get (
174+ struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{*/
175+ {
176+ if (!scoreboard ) {
177+ scoreboard = fpm_scoreboard ;
178+ }
179+
175180 if (child_index < 0 ) {
176181 child_index = fpm_scoreboard_i ;
177182 }
178183
179- if ( child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
180- return NULL ;
181- }
184+ return fpm_scoreboard_proc_get_ex ( scoreboard , child_index , scoreboard -> nprocs );
185+ }
186+ /* }}} */
182187
183- return scoreboard -> procs [child_index ];
188+ struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get_from_child (struct fpm_child_s * child ) /* {{{*/
189+ {
190+ struct fpm_worker_pool_s * wp = child -> wp ;
191+ unsigned int nprocs = wp -> config -> pm_max_children ;
192+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
193+ int child_index = child -> scoreboard_i ;
194+
195+ return fpm_scoreboard_proc_get_ex (scoreboard , child_index , nprocs );
184196}
185197/* }}} */
186198
199+
187200struct fpm_scoreboard_s * fpm_scoreboard_acquire (struct fpm_scoreboard_s * scoreboard , int nohang ) /* {{{ */
188201{
189202 struct fpm_scoreboard_s * s ;
@@ -234,28 +247,28 @@ void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc) /* {{{ */
234247 proc -> lock = 0 ;
235248}
236249
237- void fpm_scoreboard_free (struct fpm_scoreboard_s * scoreboard ) /* {{{ */
250+ void fpm_scoreboard_free (struct fpm_worker_pool_s * wp ) /* {{{ */
238251{
239- size_t scoreboard_size , scoreboard_nprocs_size ;
252+ size_t scoreboard_procs_size ;
253+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
240254
241255 if (!scoreboard ) {
242256 zlog (ZLOG_ERROR , "**scoreboard is NULL" );
243257 return ;
244258 }
245259
246- scoreboard_size = sizeof (struct fpm_scoreboard_s ) + (scoreboard -> nprocs ) * sizeof (struct fpm_scoreboard_proc_s * );
247- scoreboard_nprocs_size = sizeof (struct fpm_scoreboard_proc_s ) * scoreboard -> nprocs ;
260+ scoreboard_procs_size = sizeof (struct fpm_scoreboard_proc_s ) * wp -> config -> pm_max_children ;
248261
249- fpm_shm_free (scoreboard , scoreboard_size + scoreboard_nprocs_size );
262+ fpm_shm_free (scoreboard , sizeof ( struct fpm_scoreboard_s ) + scoreboard_procs_size );
250263}
251264/* }}} */
252265
253- void fpm_scoreboard_child_use (struct fpm_scoreboard_s * scoreboard , int child_index , pid_t pid ) /* {{{ */
266+ void fpm_scoreboard_child_use (struct fpm_child_s * child , pid_t pid ) /* {{{ */
254267{
255268 struct fpm_scoreboard_proc_s * proc ;
256- fpm_scoreboard = scoreboard ;
257- fpm_scoreboard_i = child_index ;
258- proc = fpm_scoreboard_proc_get ( scoreboard , child_index );
269+ fpm_scoreboard = child -> wp -> scoreboard ;
270+ fpm_scoreboard_i = child -> scoreboard_i ;
271+ proc = fpm_scoreboard_proc_get_from_child ( child );
259272 if (!proc ) {
260273 return ;
261274 }
@@ -264,60 +277,67 @@ void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_ind
264277}
265278/* }}} */
266279
267- void fpm_scoreboard_proc_free (struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{ */
280+ void fpm_scoreboard_proc_free (struct fpm_child_s * child ) /* {{{ */
268281{
282+ struct fpm_worker_pool_s * wp = child -> wp ;
283+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
284+ int child_index = child -> scoreboard_i ;
285+
269286 if (!scoreboard ) {
270287 return ;
271288 }
272289
273- if (child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
290+ if (child_index < 0 || child_index >= wp -> config -> pm_max_children ) {
274291 return ;
275292 }
276293
277- if (scoreboard -> procs [child_index ] && scoreboard -> procs [ child_index ] -> used > 0 ) {
278- memset (scoreboard -> procs [child_index ], 0 , sizeof (struct fpm_scoreboard_proc_s ));
294+ if (scoreboard -> procs [child_index ]. used > 0 ) {
295+ memset (& scoreboard -> procs [child_index ], 0 , sizeof (struct fpm_scoreboard_proc_s ));
279296 }
280297
281298 /* set this slot as free to avoid search on next alloc */
282299 scoreboard -> free_proc = child_index ;
283300}
284301/* }}} */
285302
286- int fpm_scoreboard_proc_alloc (struct fpm_scoreboard_s * scoreboard , int * child_index ) /* {{{ */
303+ int fpm_scoreboard_proc_alloc (struct fpm_child_s * child ) /* {{{ */
287304{
288305 int i = -1 ;
306+ struct fpm_worker_pool_s * wp = child -> wp ;
307+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
308+ int nprocs = wp -> config -> pm_max_children ;
289309
290- if (!scoreboard || ! child_index ) {
310+ if (!scoreboard ) {
291311 return -1 ;
292312 }
293313
294314 /* first try the slot which is supposed to be free */
295- if (scoreboard -> free_proc >= 0 && ( unsigned int ) scoreboard -> free_proc < scoreboard -> nprocs ) {
296- if (scoreboard -> procs [ scoreboard -> free_proc ] && !scoreboard -> procs [scoreboard -> free_proc ]-> used ) {
315+ if (scoreboard -> free_proc >= 0 && scoreboard -> free_proc < nprocs ) {
316+ if (!scoreboard -> procs [scoreboard -> free_proc ]. used ) {
297317 i = scoreboard -> free_proc ;
298318 }
299319 }
300320
301321 if (i < 0 ) { /* the supposed free slot is not, let's search for a free slot */
302322 zlog (ZLOG_DEBUG , "[pool %s] the proc->free_slot was not free. Let's search" , scoreboard -> pool );
303- for (i = 0 ; i < ( int ) scoreboard -> nprocs ; i ++ ) {
304- if (scoreboard -> procs [ i ] && !scoreboard -> procs [i ]-> used ) { /* found */
323+ for (i = 0 ; i < nprocs ; i ++ ) {
324+ if (!scoreboard -> procs [i ]. used ) { /* found */
305325 break ;
306326 }
307327 }
308328 }
309329
310330 /* no free slot */
311- if (i < 0 || i >= ( int ) scoreboard -> nprocs ) {
331+ if (i < 0 || i >= nprocs ) {
312332 zlog (ZLOG_ERROR , "[pool %s] no free scoreboard slot" , scoreboard -> pool );
313333 return -1 ;
314334 }
315335
316- scoreboard -> procs [i ]-> used = 1 ;
317- * child_index = i ;
336+ scoreboard -> procs [i ]. used = 1 ;
337+ child -> scoreboard_i = i ;
318338
319339 /* supposed next slot is free */
320- if (i + 1 >= ( int ) scoreboard -> nprocs ) {
340+ if (i + 1 >= nprocs ) {
321341 scoreboard -> free_proc = 0 ;
322342 } else {
323343 scoreboard -> free_proc = i + 1 ;
0 commit comments