aboutsummaryrefslogtreecommitdiff
path: root/src/comp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp.c')
-rw-r--r--src/comp.c87
1 files changed, 57 insertions, 30 deletions
diff --git a/src/comp.c b/src/comp.c
index c3e998a..2346306 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -24,6 +24,11 @@ struct complist
24 struct component *tail; 24 struct component *tail;
25}; 25};
26 26
27/* 0 on the first load, and 1 on all subsequent reloads. Tells the
28 component_config_commit whether we're starting from scratch or just
29 updating an already loaded configuration */
30static int loaded;
31
27static struct complist comp_list[2]; 32static struct complist comp_list[2];
28static int cur; 33static int cur;
29 34
@@ -32,13 +37,13 @@ static size_t comp_count;
32 37
33static pies_depmap_t depmap; 38static pies_depmap_t depmap;
34 39
35static int 40static inline int
36next_index (void) 41next_index (void)
37{ 42{
38 return (cur + 1) % ARRAY_SIZE (comp_list); 43 return (cur + 1) % ARRAY_SIZE (comp_list);
39} 44}
40 45
41static int 46static inline int
42prev_index (void) 47prev_index (void)
43{ 48{
44 return (cur + ARRAY_SIZE (comp_list) - 1) % ARRAY_SIZE (comp_list); 49 return (cur + ARRAY_SIZE (comp_list) - 1) % ARRAY_SIZE (comp_list);
@@ -85,6 +90,22 @@ component_append (struct component *comp)
85} 90}
86 91
87void 92void
93comp_array_remove (size_t i)
94{
95 struct component *comp = comp_array[i];
96
97 depmap_remove (depmap, i);
98 while (i < comp_count -1)
99 {
100 comp_array[i] = comp_array[i+1];
101 comp_array[i]->arridx = i;
102 i++;
103 }
104 component_free (comp);
105 comp_count--;
106}
107
108void
88component_unlink (struct component *comp) 109component_unlink (struct component *comp)
89{ 110{
90 struct complist *list = &comp_list[comp->listidx]; 111 struct complist *list = &comp_list[comp->listidx];
@@ -201,7 +222,12 @@ component_ref_decr (struct component *comp)
201{ 222{
202 assert (comp->ref_count > 0); 223 assert (comp->ref_count > 0);
203 if (--comp->ref_count == 0) 224 if (--comp->ref_count == 0)
204 component_free (comp); 225 {
226 if (component_is_active (comp))
227 comp_array_remove (comp->arridx);
228 else
229 component_free (comp);
230 }
205} 231}
206 232
207static int 233static int
@@ -425,17 +451,6 @@ report_cyclic_dependency (pies_depmap_t dp, size_t idx)
425} 451}
426 452
427void 453void
428comp_array_remove (size_t i)
429{
430 struct component *comp = comp_array[i];
431 if (i < comp_count - 1)
432 memmove (&comp_array[i], &comp_array[i+1],
433 (comp_count - i - 1) * sizeof comp_array[0]);
434 component_free (comp);
435 comp_count--;
436}
437
438void
439component_build_depmap (void) 454component_build_depmap (void)
440{ 455{
441 size_t i; 456 size_t i;
@@ -460,7 +475,6 @@ component_build_depmap (void)
460 "which is not declared"), 475 "which is not declared"),
461 comp->tag, tag); 476 comp->tag, tag);
462 comp_array_remove (i); 477 comp_array_remove (i);
463 depmap_remove (depmap, i);
464 continue; 478 continue;
465 } 479 }
466 depmap_set (depmap, i, tgt); 480 depmap_set (depmap, i, tgt);
@@ -497,10 +511,7 @@ component_build_depmap (void)
497 511
498 for (i = 0; i < comp_count;) 512 for (i = 0; i < comp_count;)
499 if (comp_array[i]->flags & CF_REMOVE) 513 if (comp_array[i]->flags & CF_REMOVE)
500 { 514 comp_array_remove (i);
501 comp_array_remove (i);
502 depmap_remove (depmap, i);
503 }
504 else 515 else
505 i++; 516 i++;
506 517
@@ -528,22 +539,36 @@ component_config_commit (void)
528 comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0])); 539 comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0]));
529 comp_count = i; 540 comp_count = i;
530 541
531 /* Rearrange components, registering prog entries for the new ones */ 542 /* Rearrange components, registering entries for the new ones */
532 for (comp = list->head, i = 0; comp; comp = comp->next, i++) 543 for (comp = list->head, i = 0; comp; )
533 { 544 {
534 match = complist_find_match (prev, comp); 545 struct component *next = comp->next;
535 if (match) 546 if (loaded && comp->mode == pies_comp_startup)
536 { 547 {
537 component_merge (match, comp); 548 /* Ignore startup components */
538 component_unlink (match); 549 component_unlink (comp);
539 match->listidx = cur;
540 component_link (match, comp->prev);
541 component_free (comp); 550 component_free (comp);
542 comp = match;
543 } 551 }
544 comp_array[i] = comp; 552 else
545 comp->arridx = i; 553 {
554 match = complist_find_match (prev, comp);
555 if (match)
556 {
557 component_merge (match, comp);
558 component_unlink (match);
559 match->listidx = cur;
560 component_link (match, comp->prev);
561 component_free (comp);
562 comp = match;
563 }
564 comp_array[i] = comp;
565 comp->arridx = i;
566 i++;
567 }
568 comp = next;
546 } 569 }
570 /* Adjust comp_count */
571 comp_count = i;
547 572
548 /* Mark orphaned progs for termination */ 573 /* Mark orphaned progs for termination */
549 list = &comp_list[prev]; 574 list = &comp_list[prev];
@@ -560,6 +585,8 @@ component_config_commit (void)
560 for (comp = comp_list[cur].head; comp; comp = comp->next) 585 for (comp = comp_list[cur].head; comp; comp = comp->next)
561 if (!comp->prog) 586 if (!comp->prog)
562 register_prog (comp); 587 register_prog (comp);
588
589 loaded = 1;
563} 590}
564 591
565static int 592static int

Return to:

Send suggestions and report system problems to the System administrator.