Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/examples/interrupt.cc
1685 views
1
/*
2
Example of instantiating of the WebAssembly module and invoking its exported
3
function.
4
5
You can compile and run this example on Linux with:
6
7
cargo build --release -p wasmtime-c-api
8
c++ examples/interrupt.cc -std=c++20 \
9
-I crates/c-api/include \
10
-I crates/c-api/wasm-c-api/include \
11
target/release/libwasmtime.a \
12
-lpthread -ldl -lm \
13
-o interrupt
14
./interrupt
15
16
Note that on Windows and macOS the command will be similar, but you'll need
17
to tweak the `-lpthread` and such annotations as well as the name of the
18
`libwasmtime.a` file on Windows.
19
*/
20
21
#include <chrono>
22
#include <fstream>
23
#include <iostream>
24
#include <sstream>
25
#include <thread>
26
#include <wasmtime.hh>
27
28
using namespace wasmtime;
29
30
std::string readFile(const char *name) {
31
std::ifstream watFile;
32
watFile.open(name);
33
std::stringstream strStream;
34
strStream << watFile.rdbuf();
35
return strStream.str();
36
}
37
38
int main() {
39
// Enable interruptible code via `Config` and then create an interrupt
40
// handle which we'll use later to interrupt running code.
41
Config config;
42
config.epoch_interruption(true);
43
Engine engine(std::move(config));
44
Store store(engine);
45
store.context().set_epoch_deadline(1);
46
47
// Compile and instantiate a small example with an infinite loop.
48
auto wat = readFile("examples/interrupt.wat");
49
Module module = Module::compile(engine, wat).unwrap();
50
Instance instance = Instance::create(store, module, {}).unwrap();
51
Func run = std::get<Func>(*instance.get(store, "run"));
52
53
// Spin up a thread to send us an interrupt in a second
54
std::thread t([engine{std::move(engine)}]() {
55
std::this_thread::sleep_for(std::chrono::seconds(1));
56
std::cout << "Interrupting!\n";
57
engine.increment_epoch();
58
});
59
60
std::cout << "Entering infinite loop ...\n";
61
auto err = run.call(store, {}).err();
62
auto &trap = std::get<Trap>(err.data);
63
64
std::cout << "trap: " << trap.message() << "\n";
65
t.join();
66
}
67
68