代码之家  ›  专栏  ›  技术社区  ›  HostileFork says dont trust SE

emscripten_sleep_with_yield()期间的非emterpreted调用

  •  1
  • HostileFork says dont trust SE  · 技术社区  · 6 年前

    我有一个C例程通过 Emscripten emterpreter ,打电话来 emscripten_sleep_with_yield() .当它屈服时,我想运行一些 -在异步回调中解释了C代码。当我尝试时,有一条错误消息说:

    “此错误发生在Emterpleter异步保存或加载堆栈期间。保存期间堆栈上是否有未经解释的代码(不允许)?

    从抽象的意义上讲,我不知道为什么在加载或保存堆栈时调用非空的保留代码会有任何问题——实际上不是 要求保留的堆栈。

    这种非解释代码的动机是更新一些对生成的例程可见的结构。我发现它是 技术上讲 回调中的普通javascript可以通过执行 setValue() 到emscripten堆中。但是通过javascript进行C操作是很难的,特别是因为许多类似这样的例程 AllocateUTF8() 呼叫 _malloc() 在引擎盖下……这些都有同样的问题。

    下面是一个简单的例子,说明了这个问题。是否有任何方法可以解决这个问题……例如,在进行非解释调用时将加载/保存状态变量存储在某个地方,然后将它们放回原处?是吗?

    测试.html

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Plain call during Emterpreter Stack Load</title>
        <script src="test.o.js"></script>
        <script>
          Module.onRuntimeInitialized = function() {
            setTimeout(function () {
              console.log("calling not_emterpreted()");
              _not_emterpreted();
            }, 0);
            _emterpreted_yielder();
            console.log("yielding...");
          }
        </script>
      </head>
      <body></body>
    </html>
    

    试验C

    #include <stdio.h>
    #include <emscripten.h>
    
    EMSCRIPTEN_KEEPALIVE void emterpreted_yielder() {
        while (1) {
            printf("emterpreted_yielder() sleeping...\n");
            emscripten_sleep_with_yield(1000);
        }
    }
    
    EMSCRIPTEN_KEEPALIVE void not_emterpreted() {
        printf("Entering not_emterpreted()\n");
    }
    

    生成方式:

    emcc test.c-o test.o.js-s emterpretify=1-s emterpretify_async=1-s emterpretify_blacklist=“[”不_emterpreted']

    评论呼叫 not_emterpreted() 在HTML中,将导致它执行人们所期望的睡眠循环。就像我说的,在这一点上,你可以用C作为原始的javascript指令来对抗emterpreter堆。但是……这不是非电子化的电子脚本C吗??:。-/

    1 回复  |  直到 6 年前