- return;
- if (!FD_ISSET(STDIN_FILENO, &s->rfds))
- return;
- buf = para_malloc(STDIN_INPUT_BUFFER_SIZE);
- ret = read(STDIN_FILENO, buf, STDIN_INPUT_BUFFER_SIZE);
- //PARA_CRIT_LOG("read ret: %d\n", ret);
- if (ret < 0)
- t->error = -ERRNO_TO_PARA_ERROR(errno);
- if (ret == 0)
- t->error = -E_STDIN_EOF;
- if (t->error < 0)
- goto err;
- btr_add_output(buf, ret, sit->btrn);
- return;
+ return 0;
+ sz = btr_pool_get_buffer(sit->btrp, &buf);
+ if (sz == 0)
+ return 0;
+ if (sit->must_set_nonblock_flag) {
+ ret = mark_fd_nonblocking(STDIN_FILENO);
+ if (ret < 0)
+ goto err;
+ sit->must_set_nonblock_flag = false;
+ }
+ /*
+ * Do not use the maximal size to avoid having only a single buffer
+ * reference for the whole pool. This is bad because if that single
+ * reference can not be freed, we're stuck.
+ */
+ sz = PARA_MIN(sz, btr_pool_size(sit->btrp) / 2);
+ ret = read_nonblock(STDIN_FILENO, buf, sz, &s->rfds, &n);
+ if (n > 0)
+ btr_add_output_pool(sit->btrp, n, sit->btrn);
+ if (ret >= 0)
+ return 0;