static void uc_uline_poll_cb(struct uloop_fd *fd, unsigned int events)
{
struct uc_uline_state *us = container_of(fd, struct uc_uline_state, fd);
+ uc_value_t *res = ucv_get(us->res);
uc_value_t *val;
- uline_poll(&us->s);
+ while (!uloop_cancelled && ucv_resource_data(res, NULL) && us->poll_cb) {
+ uline_poll(&us->s);
- val = us->line;
- if (!val)
- return;
+ val = us->line;
+ if (!val)
+ break;
- us->line = NULL;
- if (!ucv_is_callable(us->poll_cb))
- return;
+ us->line = NULL;
+ if (!ucv_is_callable(us->poll_cb))
+ break;
- uc_vm_stack_push(us->vm, ucv_get(us->res));
- uc_vm_stack_push(us->vm, ucv_get(us->poll_cb));
- cb_call(us, 1, val);
+ uc_vm_stack_push(us->vm, ucv_get(res));
+ uc_vm_stack_push(us->vm, ucv_get(us->poll_cb));
+ cb_call(us, 1, val);
+ }
+ ucv_put(res);
}
static bool