I'm testing this linked-in driver (JSON parser/encoder) <br><br>   <a href="http://github.com/davisp/eep0018/tree/master">http://github.com/davisp/eep0018/tree/master</a><br><br>The problem occurs with the 64-bit SMP emulator.   I'm building and running on Red Hat Enterprise Linux 5 (gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)) -- see full details at end of email.<br>
<br>If I use the linked-in driver from more than one process at a time, it frequently causes beam to segv with:<br>
<br><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 12"><meta name="Originator" content="Microsoft Word 12"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ccnewcom%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Ccnewcom%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"><link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Ccnewcom%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;
        mso-font-alt:"Calisto MT";
        mso-font-charset:0;
        mso-generic-font-family:roman;
        mso-font-pitch:variable;
        mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;
        mso-font-alt:"Arial Rounded MT Bold";
        mso-font-charset:0;
        mso-generic-font-family:swiss;
        mso-font-pitch:variable;
        mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-unhide:no;
        mso-style-qformat:yes;
        mso-style-parent:"";
        margin:0in;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:Calibri;
        mso-fareast-theme-font:minor-latin;
        mso-bidi-font-family:"Times New Roman";}
span.EmailStyle15
        {mso-style-type:personal;
        mso-style-noshow:yes;
        mso-style-unhide:no;
        mso-ansi-font-size:11.0pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-fareast-font-family:Calibri;
        mso-fareast-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-bidi-font-family:"Times New Roman";
        mso-bidi-theme-font:minor-bidi;
        color:#1F497D;
        mso-themecolor:dark2;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-default-props:yes;
        font-size:10.0pt;
        mso-ansi-font-size:10.0pt;
        mso-bidi-font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;
        mso-header-margin:.5in;
        mso-footer-margin:.5in;
        mso-paper-source:0;}
div.Section1
        {page:Section1;}
-->
</style>



<p class="MsoNormal">>  0 erts_ddll_proc_dead PC=0x0044eff3,
FP=0x41f5a0e0
[/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<p class="MsoNormal">   1 continue_exit_process PC=0x004a92d4,
FP=0x41f5a190 [/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<p class="MsoNormal">   2 erts_do_exit_process PC=0x004a9137,
FP=0x41f5a1c0
[/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<p class="MsoNormal">   3 process_main    
PC=0x00538b40, FP=0x41f5c0d0
[/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<p class="MsoNormal">   4 exit_sched_thr   PC=0x004a3082,
FP=0x41f5c0f0
[/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<p class="MsoNormal">   5 reinit_mutexes   PC=0x005cafe9,
FP=0x41f5c120
[/rhel5pdi/cnewcom/Erlang/erlang/erts-5.6.5/bin/beam.smp]</p>

<br>
(I haven't yet built the emulator with -g, so I don't have any more information than that, sorry)<br>
<br>I suspect the problem occurs because my test code was calling
erl_ddll:load_driver() from every process that ever needs to use the
driver.   (I know that's not optimum; this was only a test hack, not production code.)<br>
<br>
The problem seems to disappear if I switch to the non-SMP emulator (I can't rule it out, but it hasn't occured in a long test-run).<br>
<br>
The problem also seems to disappear if I use the 32-bit SMP emulator
(however, in that case I'm running on a different OS and compiler (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47)<br>
<br>My code looked like:<br><br>   112  safe_json_to_term(JsonTextBin) -><br>   113<br>   114      %% As ErlangFastJSON currently returns an untagged message and<br>   115      %% does a non-selective receive, it can return entirely the wrong<br>
   116      %% response.  So we need to use a temporary process for now.<br>   117<br>   118      CallerPid = self(),<br>   119<br>   120      WorkerPid = spawn_link(<br>   121              fun() -><br>   122<br>   123                      eep0018:start_driver(code:priv_dir(fast_json)),<br>
   124<br>   125                      JsonTerm = eep0018:json_to_term(JsonTextBin),<br>   126<br>   127                      CallerPid ! {self(), JsonTerm}<br>   128              end),<br>   129<br>   130      JsonTerm = receive {WorkerPid, T} -> T end,<br>
   131<br>   132      %% TODO: json_to_term does not currently return the 'left over' tail.<br>   133<br>   134      {ok, JsonTerm, []}.<br> <br><br>The erlang code in the driver looks like:<br><br>json_to_term(Json) when is_binary(Json) -><br>
    % The null byte is important for bare literals. Without it<br>    % yajl will throw a fit because it doesn't think it's finished<br>    % parsing correctly.<br>    [] = erlang:port_control(drv_port(), 1, <<Json/binary, 0:8>>),<br>
    receive<br>    Term -><br>        Term<br>    end.<br><br> start_driver(LibDir) -><br>    case erl_ddll:load_driver(LibDir, "eep0018_drv") of<br>    ok -><br>        ok;<br>    {error, already_loaded} -><br>
        ok;<br>        %ok = erl_ddll:reload_driver(LibDir, "eep0018_drv");<br>    {error, Error} -><br>        exit(erl_ddll:format_error(Error))<br>    end.<br><br>drv_port() -><br>    case get(eep0018_drv_port) of<br>
    undefined -><br>        Port = open_port({spawn, "eep0018_drv"}, [binary]),<br>        put(eep0018_drv_port, Port),<br>        Port;<br>    Port -><br>        Port<br>    end.<br><br><br>Here's more details about the OS/compiler on which the problem occurs.<br>
<br>% cat /etc/redhat-release<br>
Red Hat Enterprise Linux Client release 5.1 (Tikanga)<br>
<br>
% gcc -v<br>
Using built-in specs.<br>
Target: x86_64-redhat-linux<br>
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-libgcj-multifile
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada
--enable-java-awt=gtk --disable-dssi --enable-plugin
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre
--with-cpu=generic --host=x86_64-redhat-linux<br>
Thread model: posix<br>
gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)<br>
<br>
Kernel:<br><br>% uname -a<br>Linux 2.6.18-53.1.14.el5 #1 SMP Tue Feb 19 07:18:46 EST 2008 x86_64 x86_64 x86_64 GNU/Linux<br><br>