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--; } }
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; } } }
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); }
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; }
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; } }
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; } }
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; } }
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 */ } } }