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
}
@@ -162,28 +155,48 @@ struct fpm_scoreboard_s *fpm_scoreboard_get() /* {{{*/
162
155
}
163
156
/* }}} */
164
157
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 ) /* {{{*/
166
160
{
167
161
if (!scoreboard ) {
168
- scoreboard = fpm_scoreboard ;
162
+ return NULL ;
169
163
}
170
164
171
- if (! scoreboard ) {
165
+ if (child_index < 0 || ( unsigned int ) child_index >= nprocs ) {
172
166
return NULL ;
173
167
}
174
168
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
+
175
180
if (child_index < 0 ) {
176
181
child_index = fpm_scoreboard_i ;
177
182
}
178
183
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
+ /* }}} */
182
187
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 );
184
196
}
185
197
/* }}} */
186
198
199
+
187
200
struct fpm_scoreboard_s * fpm_scoreboard_acquire (struct fpm_scoreboard_s * scoreboard , int nohang ) /* {{{ */
188
201
{
189
202
struct fpm_scoreboard_s * s ;
@@ -234,28 +247,28 @@ void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc) /* {{{ */
234
247
proc -> lock = 0 ;
235
248
}
236
249
237
- void fpm_scoreboard_free (struct fpm_scoreboard_s * scoreboard ) /* {{{ */
250
+ void fpm_scoreboard_free (struct fpm_worker_pool_s * wp ) /* {{{ */
238
251
{
239
- size_t scoreboard_size , scoreboard_nprocs_size ;
252
+ size_t scoreboard_procs_size ;
253
+ struct fpm_scoreboard_s * scoreboard = wp -> scoreboard ;
240
254
241
255
if (!scoreboard ) {
242
256
zlog (ZLOG_ERROR , "**scoreboard is NULL" );
243
257
return ;
244
258
}
245
259
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 ;
248
261
249
- fpm_shm_free (scoreboard , scoreboard_size + scoreboard_nprocs_size );
262
+ fpm_shm_free (scoreboard , sizeof ( struct fpm_scoreboard_s ) + scoreboard_procs_size );
250
263
}
251
264
/* }}} */
252
265
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 ) /* {{{ */
254
267
{
255
268
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 );
259
272
if (!proc ) {
260
273
return ;
261
274
}
@@ -264,60 +277,67 @@ void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_ind
264
277
}
265
278
/* }}} */
266
279
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 ) /* {{{ */
268
281
{
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
+
269
286
if (!scoreboard ) {
270
287
return ;
271
288
}
272
289
273
- if (child_index < 0 || ( unsigned int ) child_index >= scoreboard -> nprocs ) {
290
+ if (child_index < 0 || child_index >= wp -> config -> pm_max_children ) {
274
291
return ;
275
292
}
276
293
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 ));
279
296
}
280
297
281
298
/* set this slot as free to avoid search on next alloc */
282
299
scoreboard -> free_proc = child_index ;
283
300
}
284
301
/* }}} */
285
302
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 ) /* {{{ */
287
304
{
288
305
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 ;
289
309
290
- if (!scoreboard || ! child_index ) {
310
+ if (!scoreboard ) {
291
311
return -1 ;
292
312
}
293
313
294
314
/* 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 ) {
297
317
i = scoreboard -> free_proc ;
298
318
}
299
319
}
300
320
301
321
if (i < 0 ) { /* the supposed free slot is not, let's search for a free slot */
302
322
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 */
305
325
break ;
306
326
}
307
327
}
308
328
}
309
329
310
330
/* no free slot */
311
- if (i < 0 || i >= ( int ) scoreboard -> nprocs ) {
331
+ if (i < 0 || i >= nprocs ) {
312
332
zlog (ZLOG_ERROR , "[pool %s] no free scoreboard slot" , scoreboard -> pool );
313
333
return -1 ;
314
334
}
315
335
316
- scoreboard -> procs [i ]-> used = 1 ;
317
- * child_index = i ;
336
+ scoreboard -> procs [i ]. used = 1 ;
337
+ child -> scoreboard_i = i ;
318
338
319
339
/* supposed next slot is free */
320
- if (i + 1 >= ( int ) scoreboard -> nprocs ) {
340
+ if (i + 1 >= nprocs ) {
321
341
scoreboard -> free_proc = 0 ;
322
342
} else {
323
343
scoreboard -> free_proc = i + 1 ;
0 commit comments