Неинтерпретированные вызовы во время emscripten_sleep_with_yield () - PullRequest
0 голосов
/ 06 июля 2018

У меня есть процедура C, переданная в Javascript через Emscripten emterpreter , который вызывает emscripten_sleep_with_yield(). В то время как это дает, я хотел бы запустить некоторый не -представленный C-код в асинхронных обратных вызовах. Когда я пытаюсь это сделать, появляется сообщение об ошибке:

"Эта ошибка произошла во время асинхронного сохранения или загрузки стека в emterpreter. Был ли в стеке незаполненный код во время сохранения (что не разрешено)?"

В абстрактном смысле, я не уверен, почему возникнет какая-либо проблема с вызовами неэкспертного кода во время загрузки или сохранения стека - это на самом деле не на запрашиваемом стеке быть сохраненным.

Мотивация этого неопубликованного кода заключается в обновлении некоторых структур, видимых для полученной процедуры. Я обнаружил, что технически возможно для простого JavaScript в обратных вызовах, чтобы добиться влияния, выполнив setValue() в куче emscripten. Но делать манипуляции с C через JavaScript неудобно, особенно потому, что многие подпрограммы, такие как AllocateUTF8() call _malloc() под капотом ... и те имеют ту же проблему.

Вот простой пример, который показывает проблему. Есть ли способ обойти это ... например. где-то хранить переменные состояния загрузки / сохранения, пока выполняется неопубликованный вызов, а затем вернуть их обратно ??

test.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>

test.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 = "['_ not_emterpreted']"

Комментирование вызова not_emterpreted() в html приведет к выполнению цикла ожидания, как и следовало ожидать. И, как я уже сказал, в этот момент вы можете вместо этого оказывать влияние C как необработанные инструкции JavaScript на кучу emterpreter. Но ... разве это не то, что не-эмтерпретированный emscripten C ?? : - /

1 Ответ

0 голосов
/ 09 июля 2018

Это был чрезмерно консервативный механизм ошибок в emscripten.В ответ на этот вопрос ограничение было снято:

https://github.com/kripken/emscripten/pull/6822

...