#include <chrono>
#include <fstream>
#include <iostream>
#include <sstream>
#include <thread>
using namespace wasmtime;
std::string readFile(const char *name) {
std::ifstream watFile;
watFile.open(name);
std::stringstream strStream;
strStream << watFile.rdbuf();
return strStream.str();
}
int main() {
Config config;
config.epoch_interruption(true);
Engine engine(std::move(config));
Store store(engine);
store.context().set_epoch_deadline(1);
auto wat = readFile("examples/interrupt.wat");
Module module = Module::compile(engine, wat).unwrap();
Instance instance = Instance::create(store, module, {}).unwrap();
Func run = std::get<Func>(*instance.get(store, "run"));
std::thread t([engine{std::move(engine)}]() {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Interrupting!\n";
engine.increment_epoch();
});
std::cout << "Entering infinite loop ...\n";
auto err = run.call(store, {}).err();
auto &trap = std::get<Trap>(err.data);
std::cout << "trap: " << trap.message() << "\n";
t.join();
}