Le 24/08/2012 23:44, Jeff Squyres a écrit :
> On Aug 24, 2012, at 5:17 PM, George Bosilca wrote:
>>> hwloc_obj_t already has a "void *userdata" for this. But we cannot store
>>> it in XML unless we know what it contains.
>> Contiguous binary structures with a known size can be stored in a XML file. Instead of forcing the upper level to store their meaningful information as arrays of one of a few predefined types, let them deal with the content of the binary object, and focus on preserving the binary objects in the XML structure.
>>> Exporting to XML is strictly required here since people want to add
>>> values to the XML topology in a preliminary benchmarking programs, and
>>> later read it back in their actual application (a charm++ scheduler).
>> XDR exists for ensuring consistency. Let them store what they want not just arrays.
> These are good points. Perhaps userdata is enough, and if they want the userdata to be in the XML, they can provide a callback to return an XML blob (which may be a set of new attributes, or perhaps just one big binary blob). If they don't provide a callback, then the user data is not included in the blob.
This could be:
* hwloc_set_topology_userdata_blob_callbacks(topology, exportcb, importcb)
* On XML export, hwloc calls export(obj, &buffer, &len), the application
callback allocates a contigous buffer if needed, put stuff in there,
returns it, and we store buffer/len in XML, and we free the buffer if
needed (force the application to always allocate? or add a callback flag
to know whether we have to free or not?)
* On XML import, we read the XML stuff and call import(obj, buffer,
len). The application would usually read the blob and store it back in
the object. We'll have to document that the topology isn't ready for
consulting there yet (or queue callbacks to the end of the XML parsing).
We'd likely use something like base64 to encode these blobs so that the
minimalistic parser doesn't get lost (it doesn't like unusual characters).
Another thing I am not sure about is whether a single userdata pointer
is enough. Maybe allow multiple (name,data) key pairs exactly like we do
for string infos? If so, there's no need for topology-wide
hwloc_set_topology_userdata_blob_callback(), the application gives the
right callbacks when it adds the (key,data) pair.