3.6 KiB
Emulator events
The events processed by the emulator are described in each model. Unrecognized events will cause a panic and stop the emulator in most cases.
The events may have additional arguments in the payload, which are also described. To this end, a simple language was created to specify the format of each event in a concise declaration.
Additionally, a printf-like string is declared for each event, so they can be explained in plain English. The values of the arguments are also substituted in the description of the event following a extended printf format described below.
Event format
The events are defined by a small language that defines the MCV of an event, if is a jumbo and the arguments in the payload (if any).
The grammar of this language is as follows in ABNF.
event-definition = event-mcv event-type [ "(" argument-list ")" ]
event-mcv = VCHAR VCHAR VCHAR
event-type = [ '+' ]
argument-list = argument-type " " argument-name [ ", " argument-list ]
argument-name = 1*(CHAR / DIGIT)
argument-type = type-signed | type-unsigned | type-string
type-signed = "i8" | "i16" | "i32" | "i64"
type-unsigned = "u8" | "u16" | "u32" | "u64"
type-string = "str"
The event-type
defines the type of event. Using the symbol +
defines
the event as jumbo. Otherwise, if not given it is considered a normal
event.
Here are some examples:
-
OHp
: A normal event withOHp
MCV and no payload. -
OAs(i32 cpu)
: A normal event withOAs
MCV that has the cpu stored in the payload as a 32 bits signed integer. -
OHC(i32 cpu, u64 tag)
: A normal event withOHC
MCV that has two arguments in the payload: the cpu stored as a 32 bit signed integer, and a tag stored as a 64 bit unsigned integer. -
VYc+(u32 typeid, str label)
: A jumbo event withVTc
MCV that has in the jumbo payload a 32 bits unsigned integer for the typeid followed by the label null-terminated string of variable size.
Event description
To describe the meaning of each event, a description follows the event declaration. This description accepts printf-like format specifiers that are replaced with the value of the argument they refer to.
The formats are specified as follows:
format-specifier = "%" [ printf-format] "{" argument-name "}"
argument-name = 1*(CHAR / DIGIT)
Where the optional printf-format
is any string accepted by the format
specifier of printf()
, as defined in the manual printf(3)
. If the
printf-format
is not given, the default format for the argument type
is used.
Here are some examples of event descriptions of the previous events:
{ "OHp", "pauses the execution" },
{ "OAs(i32 cpu)", "switches it's own affinity to the CPU %{cpu}" },
{ "OHC(i32 cpu, u64 tag)", "creates a new thread on CPU %{cpu} with tag %#llx{tag}" },
{ "VYc+(u32 typeid, str label)", "creates task type %{typeid} with label \"%{label}\"" },
Which would be printed with ovnidump like:
OHp pauses the execution
OAs switches it's own affinity to the CPU 7
OHC creates a new thread on CPU 3 with tag 0x7f9239c6b6c0
VYc creates task type 4 with label "block computation"
Model version
When adding new events of changing the format of already existing events, the version of the model that defines the event must be changed accordingly to the rules of Semantic Versions.
In general, adding new events will cause a minor increase in the version, while changing events will cause a major increase. Notice that the emulator will reject a stream which contains events from a model which is not compatible with the current model version.