<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><div>Each call to enif_alloc_resource() returns ONE resource object.</div><div><br></div><div>enif_make_resource expects a pointer returned from enif_alloc_resource(),</div><div>and only your &templates [0] is such a pointer.</div><div><br></div><div>So, you probable want to call enif_alloc_resource one time for every resource in your array/list.</div><div><br></div><div><br></div><div>/Sverker</div><div><br></div><div>On ons, 2018-09-19 at 13:32 -0500, Jordan Day wrote:</div><blockquote type="cite"><div dir="ltr"><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Apologies that this is more of a C question than an Erlang question…</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">I’m working on a NIF accessing a vendor’s C API and wondering what the correct approach is to handling a function from which I’d like to return a list of resources. While my functions handling individual resources seem to be working as expected (calling the destructors when the item is GC’d on the erlang side), I’m not seeing that happen with a function where I’m returning a list of resources.</span><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">In code where I’d normally do something like</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">vendor_template templates[num_templates];</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">fill_templates(templates);</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">...</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">return templates;</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">I’d like each vendor_template struct to become a resource I can pass around and have GC’d when I’m done with them, on a per-item basis. I presumed I could do the normal resource-related calls and then return an erlang list, but I’m not seeing the destructor function called when the list should be getting GC’d on the erlang side.<br><div><br></div><div>Example:<div><br></div><div>vendor_template *templates = enif_alloc_resource(TEMPLATE_TYPE, sizeof(vendor_template) * num_templates);</div></div></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">ERL_NIF_TERM template_res[num_templates];</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">fill_templates(templates);</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">for (int i = 0; i < num_templates; i++) {</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">  template_res[i] = enif_make_resource(env, &(templates[i]));</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">  enif_release_resource(&(templates[i]));</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">}</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">ERL_NIF_TERM template_list = enif_make_list_from_array(env, template_res, num_templates);</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">return template_list;</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">The returned list of resources seem to be correct, as I can use their individual references in subsequent NIF calls, but when the returned list is discarded, I never see the destructor function called.</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Any tips on what I might be doing wrong? Does the enif_make_list_from_array/2 call “break” this? If so, how can I return my list of resources?</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Regards,</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Jordan</div></div>
<pre>_______________________________________________
erlang-questions mailing list
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre></blockquote></body></html>