<div dir="ltr">If you have lengthy work that you can break it in several parts,<div>you can do easily like this:<br><div><br></div><div><div>lengthy_work(Data) -></div><div>    case lengthy_work_impl(Data) of</div><div>
<span class="" style="white-space:pre">       </span>Cont = {continue, _State} -></div><div><span class="" style="white-space:pre">    </span>    erlang:bump_reductions(1000000),</div><div><span class="" style="white-space:pre">     </span>    lengthy_work_impl(Cont);</div>
<div><span class="" style="white-space:pre">    </span>{finished, Result} -></div><div><span class="" style="white-space:pre">   </span>    Result</div><div>    end.</div><div><br></div><div>lengthy_work_impl(_) -> erlang:nif_error(undefined).</div>
</div><div><br></div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 21, 2013 at 9:54 AM, Gleb Peregud <span dir="ltr"><<a href="mailto:gleber.p@gmail.com" target="_blank">gleber.p@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I believe there is no API nor technical mean to make NIFs reentrant<br>
currently. Hence you should refrain from making NIFs which can run for<br>
a long time.<br>
<br>
But if you want to make NIFs more friendly to the scheduler, you can<br>
use erlang:bump_reductions/1 from Erlang wrapper of a NIF call.<br>
<div class="HOEnZb"><div class="h5"><br>
On Tue, May 21, 2013 at 4:14 AM, Τj <<a href="mailto:wckbluesky@yahoo.com.cn">wckbluesky@yahoo.com.cn</a>> wrote:<br>
> hi~<br>
><br>
> I try to design some nif codes recently and I reading a book " Erlang and<br>
> OTP in Action" now. In this book, chapter 12, "Integrating with foreign code<br>
> using ports and NIFs", page 313, section "Making a linked driver".<br>
><br>
> I found some words:<br>
> "<br>
> Because all these instances execute<br>
> within the memory of the Erlang VM, possibly running as different threads, the driver<br>
> code must be designed to be reentrant—executable by multiple simultaneous callers—<br>
> and must not depend on global variables or locks.<br>
> "<br>
><br>
> and then, this book give some methods to avoid this problem, something like<br>
> not to use global variables, and use driver_alloc, driver_free to allocate<br>
> memory dynamically.<br>
><br>
> of course, these words were placed into the section "Making a linked<br>
> driver"<br>
><br>
> My questions is:<br>
><br>
> 1) Is nif driver c code has the same problem? That is, nif driver c code<br>
> must be designed to reentrant?<br>
> 2) I know that, nif calling will block the VM until the driver c code<br>
> returns, Is that other problems we must notice when using nifs?<br>
><br>
> And if nif driver c code must be designed to reentrant, then I will have<br>
> anther question.<br>
> I read this words from <a href="http://erlang.org" target="_blank">erlang.org</a><br>
><br>
> "<br>
> NIFs are called directly by the same scheduler thread that executed the<br>
> calling Erlang code. The calling scheduler will thus be blocked from doing any<br>
> other work until the NIF returns<br>
> "<br>
><br>
> That is, calling scheduler is driven by the same thread, so the calling<br>
> will be blocked.<br>
> Then why should we designed our nif code to be reentrant?<br>
><br>
><br>
> The e-mail is little long, thanks for reading, and I do hope to receive any<br>
> helpful messages.<br>
> Thanks!<br>
><br>
><br>
><br>
><br>
> Best Regards<br>
> ckwei<br>
> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div>