<div dir="ltr">I am seeing a segfault that seems to be related to dirty schedulers.  I've reduced the fault to the erlang and C nif module below which executes the same nif with either the io dirty scheduler, the cpu dirty scheduler, or the normal erlang scheduler.<div><br></div><div><div><br></div><div>When I start the emulator and run either dirty nif, I get a segfault. ( see <a href="https://gist.github.com/goertzenator/6237e0200a5f7bf22976">https://gist.github.com/goertzenator/6237e0200a5f7bf22976</a>)</div><div><br></div><div>The non-dirty nif works properly, and If I run the non-dirty nif first then subsequent calls to the dirty nifs work fine.</div><div><br></div><div>Also, if I reduce the nif list length from 11 to 10, the dirty nifs work on the first go.</div><div><br></div><div>Is there a bug here or am I doing something dumb?</div><div><br></div><div>Thanks,</div><div>Dan.</div><div><br></div><div><br></div><div><br></div><div><font face="courier new, monospace">-module(dlibusb).</font></div><div><font face="courier new, monospace">-author("goertzen").</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">-on_load(init/0).</font></div><div><font face="courier new, monospace">-include_lib("eunit/include/eunit.hrl").</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">-export([mytest_io/0, mytest_cpu/0, mytest_none/0]).</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">mytest_io() -></font></div><div><font face="courier new, monospace">    erlang:nif_error(nif_library_not_loaded).</font></div><div><font face="courier new, monospace">mytest_cpu() -></font></div><div><font face="courier new, monospace">    erlang:nif_error(nif_library_not_loaded).</font></div><div><font face="courier new, monospace">mytest_none() -></font></div><div><font face="courier new, monospace">    erlang:nif_error(nif_library_not_loaded).</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">init() -></font></div><div><font face="courier new, monospace">    PrivDir = code:priv_dir(dlibusb),</font></div><div><font face="courier new, monospace">    Lib = filename:join([PrivDir, "dlibusb"]),</font></div><div><font face="courier new, monospace">    ok = erlang:load_nif(Lib, 0).</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">#include <erl_nif.h></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">   return 0;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">void unload(ErlNifEnv* env, void* priv_data)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">ERL_NIF_TERM mytest(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    const int cnt=11;  // doesn't segfault if cnt=10</font></div><div><font face="courier new, monospace">    ERL_NIF_TERM arr[cnt];</font></div><div><font face="courier new, monospace">    ERL_NIF_TERM atom_ok;</font></div><div><font face="courier new, monospace">    atom_ok = enif_make_atom(env, "ok");</font></div><div><font face="courier new, monospace">    for(int i=0; i<cnt; i++)</font></div><div><font face="courier new, monospace">    {</font></div><div><font face="courier new, monospace">        arr[i] = atom_ok;</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return enif_make_list_from_array(env, arr, cnt);</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">static ErlNifFunc nif_funcs[] = {</font></div><div><font face="courier new, monospace">    {"mytest_io",      0, mytest, ERL_NIF_DIRTY_JOB_IO_BOUND},</font></div><div><font face="courier new, monospace">    {"mytest_cpu",     0, mytest, ERL_NIF_DIRTY_JOB_CPU_BOUND},</font></div><div><font face="courier new, monospace">    {"mytest_none",    0, mytest}</font></div><div><font face="courier new, monospace">};</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">ERL_NIF_INIT(dlibusb, nif_funcs, load, 0, 0, unload)</font></div><div><br></div><div><br></div></div></div>