summaryrefslogtreecommitdiffabout
path: root/src/comp.c
Side-by-side diff
Diffstat (limited to 'src/comp.c') (more/less context) (ignore whitespace changes)
-rw-r--r--src/comp.c41
1 files changed, 10 insertions, 31 deletions
diff --git a/src/comp.c b/src/comp.c
index 2346306..25f2657 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -15,29 +15,24 @@
along with GNU Pies. If not, see <http://www.gnu.org/licenses/>. */
#include "pies.h"
#include "prog.h"
#include <assert.h>
struct complist
{
struct component *head;
struct component *tail;
};
-/* 0 on the first load, and 1 on all subsequent reloads. Tells the
- component_config_commit whether we're starting from scratch or just
- updating an already loaded configuration */
-static int loaded;
-
static struct complist comp_list[2];
static int cur;
static struct component **comp_array;
static size_t comp_count;
static pies_depmap_t depmap;
static inline int
next_index (void)
{
return (cur + 1) % ARRAY_SIZE (comp_list);
@@ -531,71 +526,55 @@ component_config_commit (void)
/* nothing */;
if (i == 0)
{
free (comp_array);
comp_array = NULL;
}
else
comp_array = grecs_realloc (comp_array, i * sizeof (comp_array[0]));
comp_count = i;
/* Rearrange components, registering entries for the new ones */
- for (comp = list->head, i = 0; comp; )
+ for (comp = list->head, i = 0; comp; comp = comp->next, i++)
{
- struct component *next = comp->next;
- if (loaded && comp->mode == pies_comp_startup)
+ match = complist_find_match (prev, comp);
+ if (match)
{
- /* Ignore startup components */
- component_unlink (comp);
+ component_merge (match, comp);
+ component_unlink (match);
+ match->listidx = cur;
+ component_link (match, comp->prev);
component_free (comp);
+ comp = match;
}
- else
- {
- match = complist_find_match (prev, comp);
- if (match)
- {
- component_merge (match, comp);
- component_unlink (match);
- match->listidx = cur;
- component_link (match, comp->prev);
- component_free (comp);
- comp = match;
- }
- comp_array[i] = comp;
- comp->arridx = i;
- i++;
- }
- comp = next;
+ comp_array[i] = comp;
+ comp->arridx = i;
}
- /* Adjust comp_count */
- comp_count = i;
/* Mark orphaned progs for termination */
list = &comp_list[prev];
if (list->head)
{
progman_foreach (mark_prog, NULL);
pies_schedule_children (PIES_CHLD_GC);
}
/* Build dependency map */
component_build_depmap ();
/* Register new progs */
for (comp = comp_list[cur].head; comp; comp = comp->next)
if (!comp->prog)
register_prog (comp);
-
- loaded = 1;
}
static int
component_verify (struct component *comp, grecs_locus_t *locus)
{
int header = 0;
int i;
#define COMPERR(func, fmt, arg) \
do \
{ \
if (!header) \
{ \

Return to:

Send suggestions and report system problems to the System administrator.