Enable all models if the require key is missing
Allows programs to update to a new libovni library without breaking the instrumentation. Only until the first call to ovni_thread_require() the models are enabled on demand.
This commit is contained in:
parent
59385fad03
commit
6f7ce4063f
@ -198,14 +198,13 @@ model_version_probe(struct model_spec *spec, struct emu *emu)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The ovni.require key is mandatory */
|
|
||||||
JSON_Object *require = json_object_dotget_object(t->meta, "ovni.require");
|
JSON_Object *require = json_object_dotget_object(t->meta, "ovni.require");
|
||||||
if (require == NULL) {
|
if (require == NULL) {
|
||||||
err("missing 'ovni.require' key in metadata");
|
warn("missing 'ovni.require' key, enabling all models");
|
||||||
return -1;
|
enable = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* But not all threads need to have this model */
|
|
||||||
const char *req_version = json_object_get_string(require, spec->name);
|
const char *req_version = json_object_get_string(require, spec->name);
|
||||||
if (req_version == NULL)
|
if (req_version == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
@ -464,29 +464,6 @@ thread_metadata_store(void)
|
|||||||
die("failed to write thread metadata");
|
die("failed to write thread metadata");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
thread_require_unsafe(const char *model, const char *version)
|
|
||||||
{
|
|
||||||
int parsedver[3];
|
|
||||||
if (version_parse(version, parsedver) != 0)
|
|
||||||
die("failed to parse provided version \"%s\"", version);
|
|
||||||
|
|
||||||
/* Store into metadata */
|
|
||||||
JSON_Object *meta = json_value_get_object(rthread.meta);
|
|
||||||
|
|
||||||
if (meta == NULL)
|
|
||||||
die("json_value_get_object failed");
|
|
||||||
|
|
||||||
char dotpath[128];
|
|
||||||
if (snprintf(dotpath, 128, "ovni.require.%s", model) >= 128)
|
|
||||||
die("model name too long");
|
|
||||||
|
|
||||||
/* TODO: What if is already set? */
|
|
||||||
|
|
||||||
if (json_object_dotset_string(meta, dotpath, version) != 0)
|
|
||||||
die("json_object_dotset_string failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ovni_thread_require(const char *model, const char *version)
|
ovni_thread_require(const char *model, const char *version)
|
||||||
{
|
{
|
||||||
@ -507,7 +484,22 @@ ovni_thread_require(const char *model, const char *version)
|
|||||||
if (version == NULL)
|
if (version == NULL)
|
||||||
die("version string is NULL");
|
die("version string is NULL");
|
||||||
|
|
||||||
thread_require_unsafe(model, version);
|
int parsedver[3];
|
||||||
|
if (version_parse(version, parsedver) != 0)
|
||||||
|
die("failed to parse provided version \"%s\"", version);
|
||||||
|
|
||||||
|
/* Store into metadata */
|
||||||
|
JSON_Object *meta = json_value_get_object(rthread.meta);
|
||||||
|
|
||||||
|
if (meta == NULL)
|
||||||
|
die("json_value_get_object failed");
|
||||||
|
|
||||||
|
char dotpath[128];
|
||||||
|
if (snprintf(dotpath, 128, "ovni.require.%s", model) >= 128)
|
||||||
|
die("model name too long");
|
||||||
|
|
||||||
|
if (json_object_dotset_string(meta, dotpath, version) != 0)
|
||||||
|
die("json_object_dotset_string failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -526,8 +518,6 @@ thread_metadata_populate(void)
|
|||||||
|
|
||||||
if (json_object_dotset_string(meta, "ovni.lib.commit", OVNI_GIT_COMMIT) != 0)
|
if (json_object_dotset_string(meta, "ovni.lib.commit", OVNI_GIT_COMMIT) != 0)
|
||||||
die("json_object_dotset_string failed");
|
die("json_object_dotset_string failed");
|
||||||
|
|
||||||
thread_require_unsafe("ovni", "1.0.0");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -111,6 +111,7 @@ instr_start(int rank, int nranks)
|
|||||||
dbg("thread %d has cpu %d (ncpus=%d)",
|
dbg("thread %d has cpu %d (ncpus=%d)",
|
||||||
get_tid(), curcpu, nranks);
|
get_tid(), curcpu, nranks);
|
||||||
|
|
||||||
|
instr_require("ovni");
|
||||||
instr_thread_execute(curcpu, -1, 0);
|
instr_thread_execute(curcpu, -1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@ main(void)
|
|||||||
int lcpu = rank % N;
|
int lcpu = rank % N;
|
||||||
|
|
||||||
ovni_thread_init(get_tid());
|
ovni_thread_init(get_tid());
|
||||||
|
instr_require("ovni");
|
||||||
instr_nosv_init();
|
instr_nosv_init();
|
||||||
instr_thread_execute(lcpu, -1, 0);
|
instr_thread_execute(lcpu, -1, 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user