<div class="gmail_quote">On Tue, Dec 13, 2011 at 13:17, Eric A. Borisch <span dir="ltr">&lt;<a href="mailto:eborisch@ieee.org">eborisch@ieee.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div id=":jk">FWIW, I&#39;ve had good luck using boost::shared_ptr&lt;MPI_Datatype_wrapper&gt;<br>
where MPI_Datatype_wrapper is a tiny class that handles retention (via<br>
MPI_Type_dup) and release (MPI_Type_free) ...<br>
<br>
In my own (user-facing) type creation function I cache the function<br>
arguments -&gt; shared_ptr mapping in a fixed-size least-recently-used<br>
container. The shared_ptr is the only thing returned to the calling<br>
program, so no MPI_Type_* calls of any kind are required to return a<br>
cache hit.</div></blockquote></div><br><div>Hi, thanks. I don&#39;t want to expose anything additional to the user and I want to tolerate the user who calls MPI_Type_create_struct(), my functions, then MPI_Type_free() every time step to create the type for their small structure. I don&#39;t want the cache to be based on the references (your &quot;cache the function arguments&quot; or Rajeev&#39;s suggestions for using keyvals to make the comparison more robust against false positives).</div>
<div><br></div><div>I&#39;ve looked at the code that others have sent in this thread and put together something based on unwrapping types with a few short-circuit possibilities. I&#39;ll come back if I get stuck again.</div>