Exemple #1
0
static void send_io(mrp_timer_t *timer, void *user_data)
{
    test_io_t *w = (test_io_t *)user_data;
    char       buf[1024];
    int        plural, size;

    MRP_UNUSED(timer);

    plural = (w->target - w->sent) != 1;
    size   = snprintf(buf, sizeof(buf),
                      "I/O #%d: %d message%s remain%s.", w->id,
                      w->target - w->sent,
                      plural ? "s" : "", plural ? "" : "s");

    if (write(w->pipe[1], buf, size) < 0) {
        /* just ignore it... */
    }
    w->sent++;

    info("MRPH I/O #%d: sent message %d/%d.", w->id, w->sent, w->target);

    if (w->sent >= w->target) {
        info("MRPH I/O #%d: sending done.", w->id);

        close(w->pipe[1]);
        mrp_del_timer(timer);
        w->timer = NULL;

        cfg.nrunning--;
    }
}
Exemple #2
0
void timer_cb(mrp_timer_t *timer, void *user_data)
{
    test_timer_t   *t = (test_timer_t *)user_data;
    struct timeval  now;
    double          diff, error;

    MRP_UNUSED(timer);

    timeval_now(&now);
    diff  = timeval_diff(&now, &t->prev) / 1000.0;
    error = diff - t->interval;
    if (error < 0.0)
        error = -error;

    info("MRPH timer #%d: %d/%d, diff %.2f (lag %.2f, %.3f %%)",
         t->id, t->count, t->target, diff, error, 100 * error / diff);

    t->count++;
    t->prev = now;

    if (t->count >= t->target) {
        info("MRPH timer #%d has finished.", t->id);

        mrp_del_timer(t->timer);
        t->timer = NULL;
        cfg.nrunning--;
    }
}
static void server_status_cb(mrp_dbus_t *dbus, const char *name, int up,
                             const char *owner, void *user_data)
{
    context_t *c = (context_t *)user_data;

    MRP_UNUSED(dbus);
    MRP_UNUSED(name);

    if (up) {
        mrp_log_info("%s came up (as %s)", name, owner);

        if (c->timer == NULL) {
            c->timer = mrp_add_timer(c->ml, 1000, send_cb, c);

            if (c->timer == NULL) {
                mrp_log_error("Failed to create D-BUS sending timer.");
                exit(1);
            }
        }
    }
    else {
        mrp_log_info("%s went down", name);

        if (c->timer != NULL) {
            mrp_del_timer(c->timer);
            c->timer = NULL;
        }
    }
}
Exemple #4
0
static void check_quit(mrp_timer_t *timer, void *user_data)
{
    MRP_UNUSED(user_data);

    if (cfg.nrunning <= 0) {
        mrp_del_timer(timer);
        mainloop_quit(&cfg);
    }
}
static void client_cleanup(context_t *c)
{
    mrp_dbus_follow_name(c->dbus, SERVER_NAME, server_status_cb, c);
    mrp_del_timer(c->timer);
    mrp_dbus_subscribe_signal(c->dbus, pong_handler, c,
                              c->name, SERVER_PATH, SERVER_INTERFACE,
                              PONG, NULL);
    mrp_dbus_unref(c->dbus);
}
Exemple #6
0
static void timer_lua_destroy(void *data)
{
    timer_lua_t *t = (timer_lua_t *)data;

    mrp_del_timer(t->t);
    t->t = NULL;

    mrp_lua_object_unref_value(t, t->L, t->callback);
    mrp_lua_object_unref_value(t, t->L, t->data);
    t->callback = LUA_NOREF;
    t->data     = LUA_NOREF;
}
Exemple #7
0
static void timer_lua_cb(mrp_timer_t *timer, void *user_data)
{
    timer_lua_t *t   = (timer_lua_t *)user_data;
    int          one = t->oneshot;

    MRP_UNUSED(timer);

    if (mrp_lua_object_deref_value(t, t->L, t->callback, false)) {
        mrp_lua_push_object(t->L, t);
        mrp_lua_object_deref_value(t, t->L, t->data, true);

        if (lua_pcall(t->L, 2, 0, 0) != 0)
            mrp_log_error("failed to invoke Lua timer callback");
    }

    if (one) {
        mrp_del_timer(t->t);
        t->t = NULL;
    }
}
Exemple #8
0
static void send_signal(mrp_timer_t *timer, void *user_data)
{
    test_signal_t *t = (test_signal_t *)user_data;

    MRP_UNUSED(timer);

    if (t->sent >= t->target)
        return;

    kill(getpid(), t->signum);
    t->sent++;
    info("MRPH signal #%d: sent signal %d/%d of %s", t->id,
         t->sent, t->target, strsignal(t->signum));

    if (t->sent >= t->target) {
        info("MRPH signal #%d: sending done", t->id);
        mrp_del_timer(t->timer);
        t->timer = NULL;
    }
}
Exemple #9
0
static void timer_lua_changed(void *data, lua_State *L, int member)
{
    timer_lua_t *t = (timer_lua_t *)data;

    MRP_UNUSED(L);

    mrp_debug("timer member #%d (%s) changed", member,
              timer_lua_members[member].name);

    switch (member) {
    case TIMER_MEMBER_INTERVAL:
        if (t->t != NULL)
            mrp_mod_timer(t->t, t->msecs);
        else {
        enable:
            t->t = mrp_add_timer(t->ctx->ml, t->msecs, timer_lua_cb, t);
            if (t->t == NULL)
                luaL_error(L, "failed to create Murphy timer");
        }
        break;

    case TIMER_MEMBER_CALLBACK:
        if (t->callback == LUA_NOREF) {
            mrp_del_timer(t->t);
            t->t = NULL;
        }
        else {
            if (t->t == NULL)
                goto enable;
        }
        break;

    default:
        break;
    }
}
Exemple #10
0
static void client_send_msg(mrp_timer_t *t, void *user_data)
{
    char buf[1024];

    MRP_UNUSED(user_data);

    if (dbus_test.nmethod < cfg.ndbus_method) {
        snprintf(buf, sizeof(buf), "DBUS message #%d", dbus_test.nmethod);
        send_dbus_message(dbus_test.conn, dbus_test.address, buf);

        info("DBUS client: sent #%d message", dbus_test.nmethod);

        dbus_test.nmethod++;
    }

    if (dbus_test.nmethod >= cfg.ndbus_method) {
        mrp_del_timer(t);
        if (cfg.ndbus_method == 0)
            cfg.nrunning--;
        else {
            /* cfg.nrunning updated only once we've received the last reply */
        }
    }
}