int neighbor_start_inactive_timer(struct ospfd *ospfd, struct interface_data *i, struct neighbor *neighbor) { int ret; struct inactivity_timer_data *inactivity_timer_data; /* FIXME: hardcoded time-out */ struct timespec timespec = { 10, 0 }; struct ev_entry *ev_entry; msg(ospfd, DEBUG, "prepare inactive timer for neighbor"); inactivity_timer_data = xzalloc(sizeof(struct inactivity_timer_data)); inactivity_timer_data->ospfd = ospfd; inactivity_timer_data->neighbor = neighbor; inactivity_timer_data->interface_data = i; neighbor->inactivity_timer_data = inactivity_timer_data; ev_entry = ev_timer_new(×pec, neighbor_inactive_timer_expired, inactivity_timer_data); if (!ev_entry) { err_msg_die(EXIT_FAILURE, "Cannot initialize a new timer"); } inactivity_timer_data->neighbor->inactive_timer_entry = ev_entry; ret = ev_add(ospfd->ev, ev_entry); if (ret != EV_SUCCESS) { err_msg_die(EXIT_FAILURE, "Cannot add new timer to global event handler"); } return SUCCESS; }
int display_new(struct uterm_display **out, const struct display_ops *ops) { struct uterm_display *disp; int ret; if (!out || !ops) return -EINVAL; disp = malloc(sizeof(*disp)); if (!disp) return -ENOMEM; memset(disp, 0, sizeof(*disp)); disp->ref = 1; disp->ops = ops; shl_dlist_init(&disp->modes); log_info("new display %p", disp); ret = shl_hook_new(&disp->hook); if (ret) goto err_free; disp->vblank_spec.it_value.tv_nsec = 15 * 1000 * 1000; ret = ev_timer_new(&disp->vblank_timer, NULL, display_vblank_timer_event, disp, NULL, NULL); if (ret) goto err_hook; ret = VIDEO_CALL(disp->ops->init, 0, disp); if (ret) goto err_timer; *out = disp; return 0; err_timer: ev_timer_unref(disp->vblank_timer); err_hook: shl_hook_free(disp->hook); err_free: free(disp); return ret; }