예제 #1
0
파일: example.c 프로젝트: tidatida/pmvm
int main(int argc, char** argv) {
    printf("Json input:\n%s\n", input);

    // initialize pmvm configuration
    struct Conf conf = {
        .vm_heap = malloc(PMVM_HEAP_SIZE),
        .vm_heap_offset = 0,
        .vm_heap_size = PMVM_HEAP_SIZE,
    };
    if (mk_dispatcher(&conf, input) == -1) { printf("Bad configuration!\n"); free(conf.vm_heap); return -1; }
    if (mk_state(&conf) == -1) { printf("Can't make state!\n"); free(conf.vm_heap); return -1; }

    printf("========================================================\n");
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    printf(">> get GSP1        // skip by priority\n");
    set_event("GPS1", &conf);
    printf("send signal: %d\n", dispatch(conf.patterns, conf.patterns_len, &(conf.state)));
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    printf(">> get COMPLETE\n");
    set_event("COMPLETE", &conf);
    printf("send signal: %d\n", dispatch(conf.patterns, conf.patterns_len, &(conf.state)));
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    printf(">> get GSP1        // catch\n");
    set_event("GPS1", &conf);
    printf("send signal: %d\n", dispatch(conf.patterns, conf.patterns_len, &(conf.state)));
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    printf(">> get GSP1        // catch\n");
    set_event("GPS1", &conf);
    printf("send signal: %d\n", dispatch(conf.patterns, conf.patterns_len, &(conf.state)));
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    printf(">> get GSP1        // catch\n");
    set_event("GPS1", &conf);
    printf("send signal: %d\n", dispatch(conf.patterns, conf.patterns_len, &(conf.state)));
    for (int i = 0; i < conf.regs_len; ++i) printf("%08x ", conf.state.regs[i]); printf("\n");

    free(conf.vm_heap);
    return 0;
}
예제 #2
0
static std::unique_ptr<Observer> stack_observer(const Function& in, const Function& out, const Function& free) {
    // special state names
    std::string n_sink = "sink";
    std::string n_make = "output was never input";
    std::string n_dupl = "duplicate output";
    std::string n_loss = "value loss";
    std::string n_lifo = "no lifo";
    std::string n_dfree = "double free";

    // make states
    std::vector<std::unique_ptr<State>> states;
    states.push_back(mk_state(n_sink, false, false));

    // ObsMake
    states.push_back(mk_state("u0", true, false));
    states.push_back(mk_state("v0", true, false));
    states.push_back(mk_state(n_make, false, true));

    // ObsDupl
    states.push_back(mk_state("u1", true, false));
    states.push_back(mk_state("v1", true, false));
    states.push_back(mk_state("u2", false, false));
    states.push_back(mk_state("v2", false, false));
    states.push_back(mk_state("u3", false, false));
    states.push_back(mk_state("v3", false, false));
    states.push_back(mk_state(n_dupl, false, true));

    // ObsLoss
    states.push_back(mk_state("u4", true, false));
    states.push_back(mk_state("v4", true, false));
    states.push_back(mk_state("u5", false, false));
    states.push_back(mk_state("v5", false, false));
    states.push_back(mk_state(n_loss, false, true));

    // ObsLifo
    states.push_back(mk_state("u6", true, false));
    states.push_back(mk_state("v6", true, false));
    states.push_back(mk_state("u7", false, false));
    states.push_back(mk_state("v7", false, false));
    states.push_back(mk_state("u8", false, false));
    states.push_back(mk_state("v8", false, false));
    states.push_back(mk_state(n_lifo, false, true));

    // ObsFree
    states.push_back(mk_state("u9", true, false));
    states.push_back(mk_state("v9", true, false));
    states.push_back(mk_state("u10", false, false));
    states.push_back(mk_state("v10", false, false));
    states.push_back(mk_state(n_dfree, false, true));


    // get hold of the stats
    const State& sink       = *states[0];
    assert(sink.name()   == n_sink);
    State& u0     	= *states[1];
    assert(u0.name()     == "u0");
    State& v0     	= *states[2];
    assert(v0.name()     == "v0");
    const State& f_make 	= *states[3];
    assert(f_make.name() == n_make);
    State& u1     	= *states[4];
    assert(u1.name()     == "u1");
    State& v1     	= *states[5];
    assert(v1.name()     == "v1");
    State& u2     	= *states[6];
    assert(u2.name()     == "u2");
    State& v2     	= *states[7];
    assert(v2.name()     == "v2");
    State& u3     	= *states[8];
    assert(u3.name()     == "u3");
    State& v3     	= *states[9];
    assert(v3.name()     == "v3");
    const State& f_dupl 	= *states[10];
    assert(f_dupl.name() == n_dupl);
    State& u4     	= *states[11];
    assert(u4.name()     == "u4");
    State& v4     	= *states[12];
    assert(v4.name()     == "v4");
    State& u5     	= *states[13];
    assert(u5.name()     == "u5");
    State& v5     	= *states[14];
    assert(v5.name()     == "v5");
    const State& f_loss 	= *states[15];
    assert(f_loss.name() == n_loss);
    State& u6     	= *states[16];
    assert(u6.name()     == "u6");
    State& v6     	= *states[17];
    assert(v6.name()     == "v6");
    State& u7     	= *states[18];
    assert(u7.name()     == "u7");
    State& v7     	= *states[19];
    assert(v7.name()     == "v7");
    State& u8     	= *states[20];
    assert(u8.name()     == "u8");
    State& v8     	= *states[21];
    assert(v8.name()     == "v8");
    const State& f_lifo 	= *states[22];
    assert(f_lifo.name() == n_lifo);
    State& u9     	= *states[23];
    assert(u9.name()     == "u9");
    State& v9     	= *states[24];
    assert(v9.name()     == "v9");
    State& u10    	= *states[25];
    assert(u10.name()     == "u10");
    State& v10    	= *states[26];
    assert(v10.name()     == "v10");
    const State& f_dfree	= *states[27];
    assert(f_dfree.name() == n_dfree);


    auto result = std::unique_ptr<Observer>(new Observer(std::move(states), 2));


    // add transitions

    // ObsMake a = 0 [u*]
    add_trans(u0, f_make, out, 0);
    add_trans(u0, sink, in, 0);

    // ObsMake a = 1 [v*]
    add_trans(v0, f_make, out, 1);
    add_trans(v0, sink, in, 1);


    // ObsDupl a = 0 [u*]
    add_trans(u1, u2, in, 0);
    add_trans(u1, sink, out, 0);
    add_trans(u2, u3, out, 0);
    add_trans(u2, sink, in, 0);
    add_trans(u3, f_dupl, out, 0);
    add_trans(u3, sink, in, 0);

    // ObsDupl a = 1 [v*]
    add_trans(v1, v2, in, 1);
    add_trans(v1, sink, out, 1);
    add_trans(v2, v3, out, 1);
    add_trans(v2, sink, in, 1);
    add_trans(v3, f_dupl, out, 1);
    add_trans(v3, sink, in, 1);


    // ObsLoss a = 0 [u*]
    add_trans(u4, u5, in, 0);
    add_trans(u4, sink, out, 0);
    add_trans(u5, f_loss, out);
    add_trans(u5, sink, out, 0);

    // ObsLoss a = 1 [v*]
    add_trans(v4, v5, in, 1);
    add_trans(v4, sink, out, 1);
    add_trans(v5, f_loss, out);
    add_trans(v5, sink, out, 1);


    // ObsLifo a = 0, b = 1
    add_trans(u6, u7, in, 0);
    add_trans(u6, sink, in, 1);
    add_trans(u6, sink, out, 0);
    add_trans(u6, sink, out, 1);
    add_trans(u7, u8, in, 1);
    add_trans(u7, sink, in, 0);
    add_trans(u7, sink, out, 0);
    add_trans(u7, sink, out, 1);
    add_trans(u8, f_lifo, out, 0);
    add_trans(u8, sink, out, 1);
    add_trans(u8, sink, in, 0);
    add_trans(u8, sink, in, 1);

    // ObsLifo a = 1, b = 0
    add_trans(v6, v7, in, 1);
    add_trans(v6, sink, in, 0);
    add_trans(v6, sink, out, 1);
    add_trans(v6, sink, out, 0);
    add_trans(v7, v8, in, 0);
    add_trans(v7, sink, in, 1);
    add_trans(v7, sink, out, 1);
    add_trans(v7, sink, out, 0);
    add_trans(v8, f_lifo, out, 1);
    add_trans(v8, sink, out, 0);
    add_trans(v8, sink, in, 1);
    add_trans(v8, sink, in, 0);

    // ObsFree a = 0, b = 1
    add_trans(u9, u10, free, 0);
    add_trans(u10, f_dfree, free, 0);

    // ObsFree a = 1, b = 0
    add_trans(v9, v10, free, 1);
    add_trans(v10, f_dfree, free, 1);


    // make observer
    return result;
}