606
612
return state->close_tag(state);
616
hwloc__xml_import_diff_one(hwloc__xml_import_state_t state,
617
hwloc_topology_diff_t *firstdiffp,
618
hwloc_topology_diff_t *lastdiffp)
621
char *obj_depth_s = NULL;
622
char *obj_index_s = NULL;
623
char *obj_attr_type_s = NULL;
624
/* char *obj_attr_index_s = NULL; unused for now */
625
char *obj_attr_name_s = NULL;
626
char *obj_attr_oldvalue_s = NULL;
627
char *obj_attr_newvalue_s = NULL;
630
char *attrname, *attrvalue;
631
if (state->next_attr(state, &attrname, &attrvalue) < 0)
633
if (!strcmp(attrname, "type"))
635
else if (!strcmp(attrname, "obj_depth"))
636
obj_depth_s = attrvalue;
637
else if (!strcmp(attrname, "obj_index"))
638
obj_index_s = attrvalue;
639
else if (!strcmp(attrname, "obj_attr_type"))
640
obj_attr_type_s = attrvalue;
641
else if (!strcmp(attrname, "obj_attr_index"))
642
{ /* obj_attr_index_s = attrvalue; unused for now */ }
643
else if (!strcmp(attrname, "obj_attr_name"))
644
obj_attr_name_s = attrvalue;
645
else if (!strcmp(attrname, "obj_attr_oldvalue"))
646
obj_attr_oldvalue_s = attrvalue;
647
else if (!strcmp(attrname, "obj_attr_newvalue"))
648
obj_attr_newvalue_s = attrvalue;
654
switch (atoi(type_s)) {
657
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR: {
658
/* object attribute diff */
659
hwloc_topology_diff_obj_attr_type_t obj_attr_type;
660
hwloc_topology_diff_t diff;
662
/* obj_attr mandatory generic attributes */
663
if (!obj_depth_s || !obj_index_s || !obj_attr_type_s)
666
/* obj_attr mandatory attributes common to all subtypes */
667
if (!obj_attr_oldvalue_s || !obj_attr_newvalue_s)
670
/* mandatory attributes for obj_attr_info subtype */
671
obj_attr_type = atoi(obj_attr_type_s);
672
if (obj_attr_type == HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO && !obj_attr_name_s)
675
/* now we know we have everything we need */
676
diff = malloc(sizeof(*diff));
679
diff->obj_attr.type = HWLOC_TOPOLOGY_DIFF_OBJ_ATTR;
680
diff->obj_attr.obj_depth = atoi(obj_depth_s);
681
diff->obj_attr.obj_index = atoi(obj_index_s);
682
memset(&diff->obj_attr.diff, 0, sizeof(diff->obj_attr.diff));
683
diff->obj_attr.diff.generic.type = obj_attr_type;
685
switch (atoi(obj_attr_type_s)) {
686
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE:
687
diff->obj_attr.diff.uint64.oldvalue = strtoull(obj_attr_oldvalue_s, NULL, 0);
688
diff->obj_attr.diff.uint64.newvalue = strtoull(obj_attr_newvalue_s, NULL, 0);
690
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO:
691
diff->obj_attr.diff.string.name = strdup(obj_attr_name_s);
693
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME:
694
diff->obj_attr.diff.string.oldvalue = strdup(obj_attr_oldvalue_s);
695
diff->obj_attr.diff.string.newvalue = strdup(obj_attr_newvalue_s);
700
(*lastdiffp)->generic.next = diff;
704
diff->generic.next = NULL;
709
return state->close_tag(state);
713
hwloc__xml_import_diff(hwloc__xml_import_state_t state,
714
hwloc_topology_diff_t *firstdiffp)
716
hwloc_topology_diff_t firstdiff = NULL, lastdiff = NULL;
720
struct hwloc__xml_import_state_s childstate;
724
ret = state->find_child(state, &childstate, &tag);
730
if (!strcmp(tag, "diff")) {
731
ret = hwloc__xml_import_diff_one(&childstate, &firstdiff, &lastdiff);
738
state->close_child(&childstate);
741
*firstdiffp = firstdiff;
609
745
/***********************************
610
746
********* main XML import *********
611
747
***********************************/
614
750
hwloc_xml__handle_distances(struct hwloc_topology *topology,
615
751
struct hwloc_xml_backend_data_s *data)
617
753
struct hwloc_xml_imported_distances_s *xmldist, *next = data->first_distances;
622
758
/* connect things now because we need levels to check/build, they'll be reconnected properly later anyway */
623
759
hwloc_connect_children(topology->levels[0][0]);
624
hwloc_connect_levels(topology);
760
if (hwloc_connect_levels(topology) < 0)
626
763
while ((xmldist = next) != NULL) {
627
764
hwloc_obj_t root = xmldist->root;
702
842
if (data->look_failed)
703
843
data->look_failed(data);
844
if (hwloc__xml_verbose())
845
fprintf(stderr, "XML component discovery failed.\n");
704
847
hwloc_localeswitch_fini();
851
/* this can be the first XML call */
853
hwloc_topology_diff_load_xml(hwloc_topology_t topology __hwloc_attribute_unused,
855
hwloc_topology_diff_t *firstdiffp, char **refnamep)
857
hwloc_localeswitch_declare;
862
if (!hwloc_libxml_callbacks && !hwloc_nolibxml_callbacks) {
867
hwloc_localeswitch_init();
871
env = getenv("HWLOC_NO_LIBXML_IMPORT");
872
force_nolibxml = (env && atoi(env));
874
if (!hwloc_libxml_callbacks || (hwloc_nolibxml_callbacks && force_nolibxml))
875
ret = hwloc_nolibxml_callbacks->import_diff(xmlpath, NULL, 0, firstdiffp, refnamep);
877
ret = hwloc_libxml_callbacks->import_diff(xmlpath, NULL, 0, firstdiffp, refnamep);
878
if (ret < 0 && errno == ENOSYS) {
879
hwloc_libxml_callbacks = NULL;
884
hwloc_localeswitch_fini();
888
/* this can be the first XML call */
890
hwloc_topology_diff_load_xmlbuffer(hwloc_topology_t topology __hwloc_attribute_unused,
891
const char *xmlbuffer, int buflen,
892
hwloc_topology_diff_t *firstdiffp, char **refnamep)
894
hwloc_localeswitch_declare;
899
if (!hwloc_libxml_callbacks && !hwloc_nolibxml_callbacks) {
904
hwloc_localeswitch_init();
908
env = getenv("HWLOC_NO_LIBXML_IMPORT");
909
force_nolibxml = (env && atoi(env));
911
if (!hwloc_libxml_callbacks || (hwloc_nolibxml_callbacks && force_nolibxml))
912
ret = hwloc_nolibxml_callbacks->import_diff(NULL, xmlbuffer, buflen, firstdiffp, refnamep);
914
ret = hwloc_libxml_callbacks->import_diff(NULL, xmlbuffer, buflen, firstdiffp, refnamep);
915
if (ret < 0 && errno == ENOSYS) {
916
hwloc_libxml_callbacks = NULL;
921
hwloc_localeswitch_fini();
708
925
/************************************************
709
926
********* XML export (common routines) *********
710
927
************************************************/
914
1131
state.end_object(&state, "object");
1135
hwloc__xml_export_diff(hwloc__xml_export_state_t parentstate, hwloc_topology_diff_t diff)
1138
struct hwloc__xml_export_state_s state;
1141
parentstate->new_child(parentstate, &state, "diff");
1143
sprintf(tmp, "%u", diff->generic.type);
1144
state.new_prop(&state, "type", tmp);
1146
switch (diff->generic.type) {
1147
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR:
1148
sprintf(tmp, "%d", diff->obj_attr.obj_depth);
1149
state.new_prop(&state, "obj_depth", tmp);
1150
sprintf(tmp, "%u", diff->obj_attr.obj_index);
1151
state.new_prop(&state, "obj_index", tmp);
1153
sprintf(tmp, "%u", diff->obj_attr.diff.generic.type);
1154
state.new_prop(&state, "obj_attr_type", tmp);
1156
switch (diff->obj_attr.diff.generic.type) {
1157
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE:
1158
sprintf(tmp, "%llu", (unsigned long long) diff->obj_attr.diff.uint64.index);
1159
state.new_prop(&state, "obj_attr_index", tmp);
1160
sprintf(tmp, "%llu", (unsigned long long) diff->obj_attr.diff.uint64.oldvalue);
1161
state.new_prop(&state, "obj_attr_oldvalue", tmp);
1162
sprintf(tmp, "%llu", (unsigned long long) diff->obj_attr.diff.uint64.newvalue);
1163
state.new_prop(&state, "obj_attr_newvalue", tmp);
1165
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME:
1166
case HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO:
1167
if (diff->obj_attr.diff.string.name)
1168
state.new_prop(&state, "obj_attr_name", diff->obj_attr.diff.string.name);
1169
state.new_prop(&state, "obj_attr_oldvalue", diff->obj_attr.diff.string.oldvalue);
1170
state.new_prop(&state, "obj_attr_newvalue", diff->obj_attr.diff.string.newvalue);
1178
state.end_object(&state, "diff");
1180
diff = diff->generic.next;
917
1184
/**********************************
918
1185
********* main XML export ********
919
1186
**********************************/
962
1235
env = getenv("HWLOC_NO_LIBXML_EXPORT");
963
1236
force_nolibxml = (env && atoi(env));
964
1238
if (!hwloc_libxml_callbacks || (hwloc_nolibxml_callbacks && force_nolibxml))
965
1239
ret = hwloc_nolibxml_callbacks->export_buffer(topology, xmlbuffer, buflen);
967
1241
ret = hwloc_libxml_callbacks->export_buffer(topology, xmlbuffer, buflen);
1242
if (ret < 0 && errno == ENOSYS) {
1243
hwloc_libxml_callbacks = NULL;
1248
hwloc_localeswitch_fini();
1252
/* this can be the first XML call */
1254
hwloc_topology_diff_export_xml(hwloc_topology_t topology __hwloc_attribute_unused,
1255
hwloc_topology_diff_t diff, const char *refname,
1256
const char *filename)
1258
hwloc_localeswitch_declare;
1259
hwloc_topology_diff_t tmpdiff;
1264
if (!hwloc_libxml_callbacks && !hwloc_nolibxml_callbacks) {
1271
if (tmpdiff->generic.type == HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX) {
1275
tmpdiff = tmpdiff->generic.next;
1278
hwloc_localeswitch_init();
1280
env = getenv("HWLOC_NO_LIBXML_EXPORT");
1281
force_nolibxml = (env && atoi(env));
1283
if (!hwloc_libxml_callbacks || (hwloc_nolibxml_callbacks && force_nolibxml))
1284
ret = hwloc_nolibxml_callbacks->export_diff_file(diff, refname, filename);
1286
ret = hwloc_libxml_callbacks->export_diff_file(diff, refname, filename);
1287
if (ret < 0 && errno == ENOSYS) {
1288
hwloc_libxml_callbacks = NULL;
1293
hwloc_localeswitch_fini();
1297
/* this can be the first XML call */
1299
hwloc_topology_diff_export_xmlbuffer(hwloc_topology_t topology __hwloc_attribute_unused,
1300
hwloc_topology_diff_t diff, const char *refname,
1301
char **xmlbuffer, int *buflen)
1303
hwloc_localeswitch_declare;
1304
hwloc_topology_diff_t tmpdiff;
1309
if (!hwloc_libxml_callbacks && !hwloc_nolibxml_callbacks) {
1316
if (tmpdiff->generic.type == HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX) {
1320
tmpdiff = tmpdiff->generic.next;
1323
hwloc_localeswitch_init();
1325
env = getenv("HWLOC_NO_LIBXML_EXPORT");
1326
force_nolibxml = (env && atoi(env));
1328
if (!hwloc_libxml_callbacks || (hwloc_nolibxml_callbacks && force_nolibxml))
1329
ret = hwloc_nolibxml_callbacks->export_diff_buffer(diff, refname, xmlbuffer, buflen);
1331
ret = hwloc_libxml_callbacks->export_diff_buffer(diff, refname, xmlbuffer, buflen);
1332
if (ret < 0 && errno == ENOSYS) {
1333
hwloc_libxml_callbacks = NULL;
969
1338
hwloc_localeswitch_fini();