-recv:
- FD_ZERO(&rfds);
- FD_ZERO(&wfds);
- timeout.tv_sec = 0;
- timeout.tv_usec = 1000 * 1000;
- max = -1;
- ret = r->pre_select(&rn, &rfds, &wfds, &timeout);
- max = MAX(max, ret);
-
- PARA_DEBUG_LOG("timeout: %lums\n", tv2ms(&timeout));
- ret = select(max + 1, &rfds, &wfds, NULL, &timeout);
- if (ret < 0) {
- if (errno == EINTR || errno == EAGAIN)
- goto recv;
- ret = -E_RECV_SELECT;
- goto out;
- }
- ret = r->post_select(&rn, ret, &rfds, &wfds);
- if (ret < 0)
- goto out;
- if (!ret)
- eof = 1;
- if (!rn.loaded) {
- if (eof)
- goto out;
- goto recv;
- }
- ret = write(STDOUT_FILENO, rn.buf, rn.loaded);
- PARA_DEBUG_LOG("wrote %d/%zd\n", ret, rn.loaded);
- if (ret < 0) {
- ret = -E_WRITE_STDOUT;
- goto out;
- }
- if (ret != rn.loaded) {
- PARA_INFO_LOG("short write %d/%zd\n", ret, rn.loaded);
- memmove(rn.buf, rn.buf + ret, rn.loaded - ret);
- }
- rn.loaded -= ret;
- if (rn.loaded || !eof)
- goto recv;
+
+ sot.btrn = btr_new_node(&(struct btr_node_description)
+ EMBRACE(.parent = rn.btrn, .name = "stdout"));
+ stdout_task_register(&sot, &s);
+
+ ti.name = r->name;
+ ti.pre_select = r->pre_select;
+ ti.post_select = r->post_select;
+ ti.context = &rn;
+ rn.task = task_register(&ti, &s);
+
+ s.default_timeout.tv_sec = 1;
+ s.default_timeout.tv_usec = 0;
+ ret = schedule(&s);
+ sched_shutdown(&s);