#include "scanner.h"
#include "resolver.h"
#include "resolver-types.h"
+#include "fact.h"
+#include "target.h"
#include "target-sorter.h"
mrp_free(t->update_targets);
mrp_free(t->update_facts);
mrp_free(t->fact_stamps);
+ mrp_free(t->directs);
t->update_targets = NULL;
t->update_facts = NULL;
t->fact_stamps = NULL;
+ t->ndirect = 0;
}
for (i = 0; i < r->ntarget; i++) {
else
goto fail;
}
+
+ target->ndirect = 0;
+ target->directs = mrp_allocz_array(int, target->ndepend);
+
+ if (target->ndepend == 0 || target->directs != NULL) {
+ fact_t *f;
+ target_t *t;
+
+ for (i = 0; i < target->ndepend; i++) {
+ if (*target->depends[i] != '$')
+ continue;
+
+ f = lookup_fact(g->r, target->depends[i]);
+
+ if (f != NULL)
+ target->directs[target->ndirect++] = f - g->r->facts;
+ else
+ target->directs[target->ndirect++] = -1;
+ }
+
+ for (i = 0; i < target->ndepend; i++) {
+ if (*target->depends[i] == '$')
+ continue;
+
+ t = lookup_target(g->r, target->depends[i]);
+
+ if (t != NULL)
+ target->directs[target->ndirect++] = g->r->nfact +
+ t - g->r->targets;
+ else
+ target->directs[target->ndirect++] = -1;
+ }
+ }
+ else
+ goto fail;
}
que_cleanup(&L);
#include "target.h"
+
int create_targets(mrp_resolver_t *r, yy_res_parser_t *parser)
{
mrp_list_hook_t *lp, *ln;
mrp_free(t->update_facts);
mrp_free(t->update_targets);
mrp_free(t->fact_stamps);
+ mrp_free(t->directs);
for (i = 0; i < t->ndepend; i++)
mrp_free(t->depends[i]);
if (t->update_facts == NULL)
return TRUE;
else {
+#ifdef CHECK_TRANSITIVE_CLOSURE_OF_FACTS
for (i = 0; (id = t->update_facts[i]) >= 0; i++) {
if (fact_stamp(r, id) > t->fact_stamps[i])
return TRUE;
}
+#else
+ for (i = 0; i < t->ndirect; i++) {
+ id = t->directs[i];
+
+ if (id < r->nfact) {
+ if (fact_stamp(r, id) > t->fact_stamps[i])
+ return TRUE;
+ }
+ }
+#endif
}
return FALSE;
if (t->update_facts != NULL)
for (i = 0; (id = t->update_facts[i]) >= 0; i++)
t->fact_stamps[i] = fact_stamp(r, id);
+
+ t->stamp = r->stamp;
}
return -EINVAL;
}
+ r->stamp = r->stamp + 1;
+
level = r->level++;
emit_resolver_event(RESOLVER_UPDATE_STARTED, t->name, level);
}
-int update_target_by_name(mrp_resolver_t *r, const char *name)
+target_t *lookup_target(mrp_resolver_t *r, const char *name)
{
- target_t *t;
+ target_t *t;
int i;
for (i = 0, t = r->targets; i < r->ntarget; i++, t++) {
if (!strcmp(t->name, name))
- return update_target(r, t);
+ return t;
}
- return FALSE;
+ return NULL;
+}
+
+
+int update_target_by_name(mrp_resolver_t *r, const char *name)
+{
+ target_t *t = lookup_target(r, name);
+
+ if (t != NULL)
+ return update_target(r, t);
+ else
+ return FALSE;
}
int i, j, idx;
target_t *t;
- fprintf(fp, "%d targets\n", r->ntarget);
for (i = 0; i < r->ntarget; i++) {
t = r->targets + i;
- fprintf(fp, "#%d: %s\n", i, t->name);
+ fprintf(fp, "#%d: %s (@%u)\n", i, t->name, t->stamp);
fprintf(fp, " dependencies:");
if (t->depends != NULL) {
fprintf(fp, " facts to check:");
if (t->update_facts != NULL) {
for (j = 0; (idx = t->update_facts[j]) >= 0; j++)
- fprintf(fp, " %s", r->facts[idx].name);
+ fprintf(fp, " %s (@%u)", r->facts[idx].name,
+ t->fact_stamps[j]);
fprintf(fp, "\n");
}
else
fprintf(fp, " target update order:");
if (t->update_targets != NULL) {
for (j = 0; (idx = t->update_targets[j]) >= 0; j++)
- fprintf(fp, " %s", r->targets[idx].name);
+ fprintf(fp, " %s (@%u)", r->targets[idx].name,
+ r->targets[idx].stamp);
+ fprintf(fp, "\n");
+ }
+ else
+ fprintf(fp, "<none>\n");
+
+ fprintf(fp, " direct dependencies:");
+ if (t->ndirect > 0) {
+ for (j = 0; j < t->ndirect; j++) {
+ idx = t->directs[j];
+ if (idx < r->nfact)
+ fprintf(fp, " %s", r->facts[idx].name);
+ else
+ fprintf(fp, " %s", r->targets[idx-r->nfact].name);
+ }
fprintf(fp, "\n");
}
else
fprintf(fp, " <none>\n");
if (t->script != NULL) {
- fprintf(fp, " update script (%s):\n",
- t->script->interpreter->name);
- fprintf(fp, "%s", t->script->source);
- fprintf(fp, " end script\n");
+ if (t->script->source != NULL) {
+ fprintf(fp, " update script (%s):\n",
+ t->script->interpreter->name);
+ fprintf(fp, "%s", t->script->source);
+ fprintf(fp, " end script\n");
+ }
+ else if (t->script->data != NULL) {
+ fprintf(fp, " precompiled update (%s):\n",
+ t->script->interpreter->name);
+ fprintf(fp, " %p\n", t->script->data);
+ fprintf(fp, " end script\n");
+ }
}
else
fprintf(fp, " no update script\n");