Yes it's an internal output state (which XML document/file are we
writing to, which XML node are we currently setting up, ...). Hiding
inside the topology would cause problems if multiple threads export at
the same time :)

I thought about renaming it from "reserved" to "private_context" or so,
but we're already talking about exporting "application-private" data, so
talking about another "private" wasn't a lot more clear :)

Brice



Le 27/08/2012 17:26, Jeff Squyres a écrit :
> Looks good.
>
> My only comment is that it seems a little odd to pass the "reserved" context 
> through.  Is that some internal XML state?  Can that be hidden somewhere 
> else, on the topo or the obj?
>
> But that's a minor quibble.
>
>
> On Aug 26, 2012, at 5:52 AM, Brice Goglin wrote:
>
>> (breaking the thread since we're far from valarrays now).
>>
>> I've played with this idea and came with the attached interface change.
>> Aside from low-level backend changes, everything was very easy to implement.
>>
>> Let's take an example. I modified lstopo to add some userdata to the
>> root object and define the following export callback:
>>
>> static void export(void *reserved, hwloc_topology_t topo, hwloc_obj_t obj)
>> {
>>  /* we export random stuff instead of the actual userdata content */
>>  hwloc_export_obj_userdata(reserved, topo, obj, NULL, "coincoin", 8); /* no 
>> name */
>>  hwloc_export_obj_userdata(reserved, topo, obj, "MyName", "foobar", 6);
>>  hwloc_export_obj_userdata(reserved, topo, obj, "MyValue", "foobarbarbar", 
>> 10); /* truncated to 10 chars */
>> }
>>
>>
>> This callback is only called for the root object since others have
>> userdata=NULL. It exports three lines to XML:
>>
>>    <userdata length="8">coincoin</userdata>
>>    <userdata name="MyName" length="6">foobar</userdata>
>>    <userdata name="MyValue" length="10">foobarbarb</userdata>
>>
>>
>> The idea behind multiple userdata lines per object is that it helps the
>> application structure its userdata without having to create a single
>> contigous buffer.
>>
>> When you import this with an import() callback, you get three
>> invocations of the callback:
>>
>> ##### name (null) value coincoin length 8
>> ##### name MyName value foobar length 6
>> ##### name MyValue value foobarbarb length 10
>>
>>
>> The optional "name" attribute lets the application recognize things (but
>> they always looked in-order in my testing).
>>
>> My user that wants valarrays would likely export:
>> * the number of elements in his arrays as a first line
>> * the content of his latency array as a second line
>> * the content of his bandwidth array as a third line
>>
>> We set import() and export() callbacks with two different function
>> because it makes the doc much more clear and the requirements are
>> different (import() must be set before load(), export() must use
>> export_userdata()).
>>
>> I am satisfied with all this, I don't have any concern with the
>> genericity of the interface anymore.
>>
>>
>> Now, I still think we should offer some optional basic encoding
>> capability since many users have no clue about XDR or base64. For
>> instance, add export_userdata_encoded() on the side of
>> export_userdata(). On the import side, we could let the application
>> decode with a dedicated hwloc function. But I think I would rather mark
>> the XML line as "encoded" so that hwloc transparently decodes before
>> passing the data to the import() callback.
>>
>> Brice
>>
>> <userdata.patch>_______________________________________________
>> hwloc-devel mailing list
>> hwloc-de...@open-mpi.org
>> http://www.open-mpi.org/mailman/listinfo.cgi/hwloc-devel
>

Reply via email to