Thanks, that makes sense! I definitely needed NO_EXIT_RUNTIME.

I misunderstood what postRun was for. Where should I add some JavaScript
code that should run after main(), but before the runtime is shut down?


On Tue, Aug 1, 2017 at 3:18 PM Alon Zakai <[email protected]> wrote:

> PR up: https://github.com/kripken/emscripten/pull/5434
>
> On Tue, Aug 1, 2017 at 11:44 AM, Alon Zakai <[email protected]> wrote:
>
>> Yeah, I think the problem here is that the runtime is shut down (libc io
>> streams are flushed and closed, etc.) after main() exits. If you build with
>> -s NO_EXIT_RUNTIME=1 then it does print that out.
>>
>> We have assertions on calling into the runtime after it was shut down,
>> and those aren't being hit here, sadly - they should have shown an error
>> message with how to fix things. Looks like the bug is that wasm async
>> compilation goes around those assertions, which we should fix. I'll look
>> into it.
>>
>>
>>
>> On Tue, Aug 1, 2017 at 11:41 AM, 'Jacob Gravelle' via emscripten-discuss
>> <[email protected]> wrote:
>>
>>> I'm assuming you don't want to use postRun for a function named
>>> wasm_init? Of those hooks, you'd probably want to use preRun, which when I
>>> try it doesn't work with "Assertion failed: invalid handle for stdin (1)".
>>>
>>> My understanding of why printf doesn't work there is because postRun is
>>> ran after main returns, so the wasm runtime doesn't flush the written
>>> buffer, and preRun is called before the runtime is initialized.
>>> Looking at the timings in the run function (that calls Module['_main'])
>>> here:
>>> https://github.com/kripken/emscripten/blob/incoming/src/postamble.js#L222 ,
>>> we want to run static initializers (that can print, at least) before we
>>> call main, but after the runtime is initialized. It looks like preMain is
>>> the right timing, but how to put callbacks there?
>>> We have a function, addOnPreMain, that does the trick:
>>> https://github.com/kripken/emscripten/blob/incoming/src/preamble.js#L1693 .
>>> So to do that, we create a post-script file, shell_post.js, with the
>>> contents:
>>> addOnPreMain(function() { Module.ccall('wasm_init', null, []); });
>>>
>>> Then we compile with
>>> emcc hello.c -s WASM=1 -o hello.html --shell-file shell.html --post-js
>>> shell_post.js
>>>
>>> And our output is:
>>> printf wasm_init
>>> Module.print wasm_init
>>> printf main
>>> Module.print main
>>>
>>> On Mon, Jul 31, 2017 at 9:09 PM 'Dominic Mazzoni' via emscripten-discuss
>>> <[email protected]> wrote:
>>>
>>>> Hi - I'm having trouble mixing calls to printf (for logging/debugging)
>>>> with reading and writing files from the built-in MEMFS. Hopefully I'm just
>>>> doing something stupid - perhaps postRun is the wrong place to insert a
>>>> function call?
>>>>
>>>> I'm on Mac OS X 10.12.5, and I compiled emsdk from source according to
>>>> the instructions at webassembly.org
>>>> <http://webassembly.org/getting-started/developers-guide/>.
>>>>
>>>> For my minimal repro, make a copy of
>>>> emscripten/incoming/src/shell_minimal.html and modify the postRun line to
>>>> be:
>>>>
>>>> postRun: [function() { Module.ccall('wasm_init', null, []); }],
>>>>
>>>> Then create a file hello.c like this:
>>>>
>>>> #include <stdio.h>
>>>> #include <emscripten/emscripten.h>
>>>>
>>>> int main(int argc, char ** argv) {
>>>>   printf("printf main\n");
>>>>   EM_ASM(Module.print("Module.print main"));
>>>> }
>>>>
>>>> #ifdef __cplusplus
>>>> extern "C" {
>>>> #endif
>>>>
>>>> int EMSCRIPTEN_KEEPALIVE wasm_init() {
>>>>   FILE* fp = fopen("test.txt", "w");
>>>>   printf("printf wasm_init\n");
>>>>   EM_ASM(Module.print("Module.print wasm_init"));
>>>>   return 0;
>>>> }
>>>>
>>>> #ifdef __cplusplus
>>>> }
>>>> #endif
>>>>
>>>> And compile it like this:
>>>>
>>>> emcc hello.c -s WASM=1 -o hello.html --shell-file shell.html
>>>>
>>>> What I get:
>>>>
>>>> printf main
>>>> Module.print main
>>>> Module.print wasm_init
>>>>
>>>> What I expect to get:
>>>>
>>>> printf main
>>>> Module.print main
>>>> printf wasm_init
>>>> Module.print wasm_init
>>>>
>>>> Important note: if I comment out the fopen line, it succeeds (the
>>>> second printf works). If I use other mechanisms to log and debug, I can
>>>> confirm that the fopen is succeeding - just somehow once I call fopen just
>>>> once I can't use printf to write to Module.print anymore.
>>>>
>>>> Thanks!
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "emscripten-discuss" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "emscripten-discuss" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to