From: "Richard W.M. Jones" <rich@annexia.org>
To: caml-list@inria.fr
Subject: [Caml-list] Native dynlink and reloading modules
Date: Thu, 22 Mar 2012 11:47:10 +0000 [thread overview]
Message-ID: <20120322114710.GA21740@annexia.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 738 bytes --]
I'm a bit surprised to find that native dynlink doesn't work in the
same way as bytecode dynlink in respect to reloading the same module.
(See attached test program)
In bytecode dynlink, reloading (ie. Dynlink.loadfile) the same module
causes the new module code to override the old module code:
$ ./dynlink_test
testing bytecode ...
a
b
But in native dynlink, the new module is silently discarded and the
old code appears to run:
$ ./dynlink_test
testing native ...
a
a
I would classify this as a bug, but I'm not quite sure what is
expected to happen. Is there some other way to override a module as
in bytecode?
$ ocaml -version
The Objective Caml toplevel, version 3.12.1
Rich.
--
Richard Jones
Red Hat
[-- Attachment #2: dynlink_test.ml --]
[-- Type: text/plain, Size: 1142 bytes --]
(* Save this file as 'dynlink_test.ml'
* and compile it with:
* ocamlc dynlink.cma dynlink_value.ml dynlink_test.ml -o dynlink_test
* or:
* ocamlopt dynlink.cmxa dynlink_value.ml dynlink_test.ml -o dynlink_test
*)
open Printf
let native = Dynlink.is_native
let suffix = if native then "cmxs" else "cmo"
let write_test_module v =
let chan = open_out "dynlink_test_module.ml" in
fprintf chan "Dynlink_value.value := \"%s\"\n" v;
close_out chan;
let cmd =
if native then
"ocamlopt -c dynlink_test_module.ml &&\nocamlopt -shared dynlink_test_module.cmx -o dynlink_test_module.cmxs"
else
"ocamlc -c dynlink_test_module.ml" in
assert (Sys.command cmd = 0)
let main () =
printf "testing %s ...\n" (if native then "native" else "bytecode");
write_test_module "a";
Dynlink.loadfile (sprintf "dynlink_test_module.%s" suffix);
print_endline !Dynlink_value.value;
write_test_module "b";
Dynlink.loadfile (sprintf "dynlink_test_module.%s" suffix);
print_endline !Dynlink_value.value
let () =
try main ()
with
| Dynlink.Error err ->
eprintf "dynlink: %s\n" (Dynlink.error_message err)
[-- Attachment #3: dynlink_value.ml --]
[-- Type: text/plain, Size: 67 bytes --]
(* Save this file as 'dynlink_value.ml' *)
let value = ref "none"
next reply other threads:[~2012-03-22 11:47 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-22 11:47 Richard W.M. Jones [this message]
2012-03-22 12:51 ` Alain Frisch
2012-03-22 16:42 ` Richard W.M. Jones
2012-03-22 17:14 ` Pierre Chambart
2012-03-22 20:12 ` Richard W.M. Jones
2012-03-31 18:40 ` Richard W.M. Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120322114710.GA21740@annexia.org \
--to=rich@annexia.org \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox