6
6
#include <time.h>
7
7
8
8
#include "fpm_config.h"
9
+ #include "fpm_children.h"
9
10
#include "fpm_scoreboard.h"
10
11
#include "fpm_shm.h"
11
12
#include "fpm_sockets.h"
@@ -23,7 +24,6 @@ static float fpm_scoreboard_tick;
23
24
int fpm_scoreboard_init_main () /* {{{ */
24
25
{
25
26
struct fpm_worker_pool_s * wp ;
26
- unsigned int i ;
27
27
28
28
#ifdef HAVE_TIMES
29
29
#if (defined(HAVE_SYSCONF ) && defined(_SC_CLK_TCK ))
@@ -40,7 +40,7 @@ int fpm_scoreboard_init_main() /* {{{ */
40
40
41
41
42
42
for (wp = fpm_worker_all_pools ; wp ; wp = wp -> next ) {
43
- size_t scoreboard_size , scoreboard_nprocs_size ;
43
+ size_t scoreboard_procs_size ;
44
44
void * shm_mem ;
45
45
46
46
if (wp -> config -> pm_max_children < 1 ) {
@@ -53,22 +53,15 @@ int fpm_scoreboard_init_main() /* {{{ */
53
53
return -1 ;
54
54
}
55
55
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 );
59
58
60
59
if (!shm_mem ) {
61
60
return -1 ;
62
61
}
63
- wp -> scoreboard = shm_mem ;
62
+ wp -> scoreboard = shm_mem ;
63
+ wp -> scoreboard -> pm = wp -> config -> pm ;
64
64
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 ;
72
65
wp -> scoreboard -> start_epoch = time (NULL );
73
66
strlcpy (wp -> scoreboard -> pool , wp -> config -> name , sizeof (wp -> scoreboard -> pool ));
74
67
@@ -167,28 +160,48 @@ struct fpm_scoreboard_s *fpm_scoreboard_get() /* {{{*/
167
160
}
168
161
/* }}} */
169
162
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 ) /* {{{*/
171
165
{
172
166
if (!scoreboard ) {
173
- scoreboard = fpm_scoreboard ;
167
+ return NULL ;
174
168
}
175
169
176
- if (! scoreboard ) {
170
+ if (child_index < 0 || ( unsigned int ) child_index >= nprocs ) {
177
171
return NULL ;
178
172
}
179
173
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
+
180
185
if (child_index < 0 ) {
181
186
child_index = fpm_scoreboard_i ;
182
187
}
183
188
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
+ /* }}} */
187
192
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 );
189
201
}
190
202
/* }}} */
191
203
204
+
192
205
struct fpm_scoreboard_s * fpm_scoreboard_acquire (struct fpm_scoreboard_s * scoreboard , int nohang ) /* {{{ */
193
206
{
194
207
struct fpm_scoreboard_s * s ;
@@ -239,28 +252,28 @@ void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc) /* {{{ */
239
252
proc -> lock = 0 ;
240
253
}
241
254
242
- void fpm_scoreboard_free (struct fpm_scoreboard_s * scoreboard ) /* {{{ */
255
+ void fpm_scoreboard_free (struct fpm_worker_pool_s * wp ) /* {{{ */
243
256
{
244
- size_t scoreboard_size , scoreboard_nprocs_size ;
257
+ size_t scoreboard_procs_size ;
258
+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
245
259
246
260
if (!scoreboard ) {
247
261
zlog (ZLOG_ERROR , "**scoreboard is NULL" );
248
262
return ;
249
263
}
250
264
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 ;
253
266
254
- fpm_shm_free (scoreboard , scoreboard_size + scoreboard_nprocs_size );
267
+ fpm_shm_free (scoreboard , sizeof ( struct fpm_scoreboard_s ) + scoreboard_procs_size );
255
268
}
256
269
/* }}} */
257
270
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 ) /* {{{ */
259
272
{
260
273
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 );
264
277
if (!proc ) {
265
278
return ;
266
279
}
@@ -269,60 +282,67 @@ void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_ind
269
282
}
270
283
/* }}} */
271
284
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 ) /* {{{ */
273
286
{
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
+
274
291
if (!scoreboard ) {
275
292
return ;
276
293
}
277
294
278
- if (child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
295
+ if (child_index < 0 || child_index >= wp -> config -> pm_max_children ) {
279
296
return ;
280
297
}
281
298
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 ));
284
301
}
285
302
286
303
/* set this slot as free to avoid search on next alloc */
287
304
scoreboard -> free_proc = child_index ;
288
305
}
289
306
/* }}} */
290
307
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 ) /* {{{ */
292
309
{
293
310
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 ;
294
314
295
- if (!scoreboard || ! child_index ) {
315
+ if (!scoreboard ) {
296
316
return -1 ;
297
317
}
298
318
299
319
/* 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 ) {
302
322
i = scoreboard -> free_proc ;
303
323
}
304
324
}
305
325
306
326
if (i < 0 ) { /* the supposed free slot is not, let's search for a free slot */
307
327
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 */
310
330
break ;
311
331
}
312
332
}
313
333
}
314
334
315
335
/* no free slot */
316
- if (i < 0 || i >= ( int ) scoreboard -> nprocs ) {
336
+ if (i < 0 || i >= nprocs ) {
317
337
zlog (ZLOG_ERROR , "[pool %s] no free scoreboard slot" , scoreboard -> pool );
318
338
return -1 ;
319
339
}
320
340
321
- scoreboard -> procs [i ]-> used = 1 ;
322
- * child_index = i ;
341
+ scoreboard -> procs [i ]. used = 1 ;
342
+ child -> scoreboard_i = i ;
323
343
324
344
/* supposed next slot is free */
325
- if (i + 1 >= ( int ) scoreboard -> nprocs ) {
345
+ if (i + 1 >= nprocs ) {
326
346
scoreboard -> free_proc = 0 ;
327
347
} else {
328
348
scoreboard -> free_proc = i + 1 ;
0 commit comments