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
@@ -167,28 +160,48 @@ struct fpm_scoreboard_s *fpm_scoreboard_get() /* {{{*/
167160}
168161/* }}} */
169162
170- struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get (struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{*/
163+ static inline struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get_ex (
164+ struct fpm_scoreboard_s * scoreboard , int child_index , unsigned int nprocs ) /* {{{*/
171165{
172166 if (!scoreboard ) {
173- scoreboard = fpm_scoreboard ;
167+ return NULL ;
174168 }
175169
176- if (! scoreboard ) {
170+ if (child_index < 0 || ( unsigned int ) child_index >= nprocs ) {
177171 return NULL ;
178172 }
179173
174+ return & scoreboard -> procs [child_index ];
175+ }
176+ /* }}} */
177+
178+ struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get (
179+ struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{*/
180+ {
181+ if (!scoreboard ) {
182+ scoreboard = fpm_scoreboard ;
183+ }
184+
180185 if (child_index < 0 ) {
181186 child_index = fpm_scoreboard_i ;
182187 }
183188
184- if ( child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
185- return NULL ;
186- }
189+ return fpm_scoreboard_proc_get_ex ( scoreboard , child_index , scoreboard -> nprocs );
190+ }
191+ /* }}} */
187192
188- return scoreboard -> procs [child_index ];
193+ struct fpm_scoreboard_proc_s * fpm_scoreboard_proc_get_from_child (struct fpm_child_s * child ) /* {{{*/
194+ {
195+ struct fpm_worker_pool_s * wp = child -> wp ;
196+ unsigned int nprocs = wp -> config -> pm_max_children ;
197+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
198+ int child_index = child -> scoreboard_i ;
199+
200+ return fpm_scoreboard_proc_get_ex (scoreboard , child_index , nprocs );
189201}
190202/* }}} */
191203
204+
192205struct fpm_scoreboard_s * fpm_scoreboard_acquire (struct fpm_scoreboard_s * scoreboard , int nohang ) /* {{{ */
193206{
194207 struct fpm_scoreboard_s * s ;
@@ -239,28 +252,28 @@ void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc) /* {{{ */
239252 proc -> lock = 0 ;
240253}
241254
242- void fpm_scoreboard_free (struct fpm_scoreboard_s * scoreboard ) /* {{{ */
255+ void fpm_scoreboard_free (struct fpm_worker_pool_s * wp ) /* {{{ */
243256{
244- size_t scoreboard_size , scoreboard_nprocs_size ;
257+ size_t scoreboard_procs_size ;
258+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
245259
246260 if (!scoreboard ) {
247261 zlog (ZLOG_ERROR , "**scoreboard is NULL" );
248262 return ;
249263 }
250264
251- scoreboard_size = sizeof (struct fpm_scoreboard_s ) + (scoreboard -> nprocs ) * sizeof (struct fpm_scoreboard_proc_s * );
252- scoreboard_nprocs_size = sizeof (struct fpm_scoreboard_proc_s ) * scoreboard -> nprocs ;
265+ scoreboard_procs_size = sizeof (struct fpm_scoreboard_proc_s ) * wp -> config -> pm_max_children ;
253266
254- fpm_shm_free (scoreboard , scoreboard_size + scoreboard_nprocs_size );
267+ fpm_shm_free (scoreboard , sizeof ( struct fpm_scoreboard_s ) + scoreboard_procs_size );
255268}
256269/* }}} */
257270
258- void fpm_scoreboard_child_use (struct fpm_scoreboard_s * scoreboard , int child_index , pid_t pid ) /* {{{ */
271+ void fpm_scoreboard_child_use (struct fpm_child_s * child , pid_t pid ) /* {{{ */
259272{
260273 struct fpm_scoreboard_proc_s * proc ;
261- fpm_scoreboard = scoreboard ;
262- fpm_scoreboard_i = child_index ;
263- proc = fpm_scoreboard_proc_get ( scoreboard , child_index );
274+ fpm_scoreboard = child -> wp -> scoreboard ;
275+ fpm_scoreboard_i = child -> scoreboard_i ;
276+ proc = fpm_scoreboard_proc_get_from_child ( child );
264277 if (!proc ) {
265278 return ;
266279 }
@@ -269,60 +282,67 @@ void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_ind
269282}
270283/* }}} */
271284
272- void fpm_scoreboard_proc_free (struct fpm_scoreboard_s * scoreboard , int child_index ) /* {{{ */
285+ void fpm_scoreboard_proc_free (struct fpm_child_s * child ) /* {{{ */
273286{
287+ struct fpm_worker_pool_s * wp = child -> wp ;
288+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
289+ int child_index = child -> scoreboard_i ;
290+
274291 if (!scoreboard ) {
275292 return ;
276293 }
277294
278- if (child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
295+ if (child_index < 0 || child_index >= wp -> config -> pm_max_children ) {
279296 return ;
280297 }
281298
282- if (scoreboard -> procs [child_index ] && scoreboard -> procs [ child_index ] -> used > 0 ) {
283- memset (scoreboard -> procs [child_index ], 0 , sizeof (struct fpm_scoreboard_proc_s ));
299+ if (scoreboard -> procs [child_index ]. used > 0 ) {
300+ memset (& scoreboard -> procs [child_index ], 0 , sizeof (struct fpm_scoreboard_proc_s ));
284301 }
285302
286303 /* set this slot as free to avoid search on next alloc */
287304 scoreboard -> free_proc = child_index ;
288305}
289306/* }}} */
290307
291- int fpm_scoreboard_proc_alloc (struct fpm_scoreboard_s * scoreboard , int * child_index ) /* {{{ */
308+ int fpm_scoreboard_proc_alloc (struct fpm_child_s * child ) /* {{{ */
292309{
293310 int i = -1 ;
311+ struct fpm_worker_pool_s * wp = child -> wp ;
312+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
313+ int nprocs = wp -> config -> pm_max_children ;
294314
295- if (!scoreboard || ! child_index ) {
315+ if (!scoreboard ) {
296316 return -1 ;
297317 }
298318
299319 /* first try the slot which is supposed to be free */
300- if (scoreboard -> free_proc >= 0 && ( unsigned int ) scoreboard -> free_proc < scoreboard -> nprocs ) {
301- if (scoreboard -> procs [ scoreboard -> free_proc ] && !scoreboard -> procs [scoreboard -> free_proc ]-> used ) {
320+ if (scoreboard -> free_proc >= 0 && scoreboard -> free_proc < nprocs ) {
321+ if (!scoreboard -> procs [scoreboard -> free_proc ]. used ) {
302322 i = scoreboard -> free_proc ;
303323 }
304324 }
305325
306326 if (i < 0 ) { /* the supposed free slot is not, let's search for a free slot */
307327 zlog (ZLOG_DEBUG , "[pool %s] the proc->free_slot was not free. Let's search" , scoreboard -> pool );
308- for (i = 0 ; i < ( int ) scoreboard -> nprocs ; i ++ ) {
309- if (scoreboard -> procs [ i ] && !scoreboard -> procs [i ]-> used ) { /* found */
328+ for (i = 0 ; i < nprocs ; i ++ ) {
329+ if (!scoreboard -> procs [i ]. used ) { /* found */
310330 break ;
311331 }
312332 }
313333 }
314334
315335 /* no free slot */
316- if (i < 0 || i >= ( int ) scoreboard -> nprocs ) {
336+ if (i < 0 || i >= nprocs ) {
317337 zlog (ZLOG_ERROR , "[pool %s] no free scoreboard slot" , scoreboard -> pool );
318338 return -1 ;
319339 }
320340
321- scoreboard -> procs [i ]-> used = 1 ;
322- * child_index = i ;
341+ scoreboard -> procs [i ]. used = 1 ;
342+ child -> scoreboard_i = i ;
323343
324344 /* supposed next slot is free */
325- if (i + 1 >= ( int ) scoreboard -> nprocs ) {
345+ if (i + 1 >= nprocs ) {
326346 scoreboard -> free_proc = 0 ;
327347 } else {
328348 scoreboard -> free_proc = i + 1 ;
0 commit comments