<br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Dec 10, 2012 at 6:46 PM, Amit Kapoor <span dir="ltr"><<a href="mailto:amit@koanect.com" target="_blank">amit@koanect.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Hi folks,<br>
<br>
Trying to understand load_drive behaviour. The test code I am using is at the<br>
end of this email. The driver being loaded is a dummy driver with a printf<br>
message in the DRIVER_INIT code. If I call spawn:test(true,3), the printf<br>
message in DRIVER_INIT code gets displayed 3 times, whereas spawn:test(false,3)<br>
displays the same message only once. The erl_ddll manual is a bit lacking in<br>
this area, so wanted to get some clarification.<br>
<br>
1. Is this the expected behaviour?<br></blockquote><div><br></div><div>This is expected because in the true case you're spawning a new process that loads the driver, and when that process exits, the driver gets unloaded. Near the top of the erl_ddll man page you can find this passage: "The driver is always reference counted and as long as a process keeping the driver loaded is still alive, the driver is present in the system."</div>
<div><br></div><div>If you go into an erlang shell and run the false case first, then run the true case, the 3 true attempts will all get already_loaded because your shell process already loaded the driver in the first false case, and assuming that shell process is still alive, the true cases have no need to load it.</div>
<div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
2. Child processes seem to 'inherit' drivers loaded by parent process?<br></blockquote><div><br></div><div>I don't think so. If the parent loads the driver and doesn't die, then the driver remains loaded and the child will also be able to see the driver. You can use erl_ddll:info(test_drv, processes) anytime after loading it to see what processes have a ref count on it. For example, after running spawn:test(false, 3) in your shell you'll see from erl_ddll:info(test_drv, processes) that the shell process has a ref count of 3 on test_drv.</div>
<div><br></div><div>--steve</div></div></div>