Skip to content
Snippets Groups Projects
Commit a8a2f090 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Don't loop waiting to write entire received data to conn buf

Shaves time down to 3.85 seconds.
parent 5bf0eba2
No related branches found
No related tags found
No related merge requests found
Pipeline #7736 passed
......@@ -308,36 +308,43 @@ pty_input_thread(void *args)
{
fd_set rds;
int rd;
int buffered;
size_t buffer;
size_t buffered;
int i;
struct timeval tv;
size_t bufsz = 0;
SetThreadName("PTY Input");
conn_api.input_thread_running = 1;
while (master != -1 && !conn_api.terminate) {
if ((i = waitpid(child_pid, &status, WNOHANG)))
break;
FD_ZERO(&rds);
FD_SET(master, &rds);
tv.tv_sec = 0;
tv.tv_usec = 100000;
rd = select(master + 1, &rds, NULL, NULL, &tv);
if (rd == -1) {
if (errno == EBADF)
break;
rd = 0;
}
if (rd == 1) {
rd = read(master, conn_api.rd_buf, conn_api.rd_buf_size);
if (rd <= 0)
break;
if (bufsz < BUFFER_SIZE) {
FD_ZERO(&rds);
FD_SET(master, &rds);
tv.tv_sec = 0;
if (bufsz)
tv.tv_usec = 0;
else
tv.tv_usec = 100000;
rd = select(master + 1, &rds, NULL, NULL, &tv);
if (rd == -1) {
if (errno == EBADF)
break;
rd = 0;
}
if (rd == 1) {
rd = read(master, conn_api.rd_buf + bufsz, conn_api.rd_buf_size - bufsz);
if (rd <= 0)
break;
bufsz += rd;
}
}
buffered = 0;
while (buffered < rd && !conn_api.terminate) {
if (bufsz > 0) {
pthread_mutex_lock(&(conn_inbuf.mutex));
buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
conn_buf_wait_free(&conn_inbuf, 1, 100);
buffered = conn_buf_put(&conn_inbuf, conn_api.rd_buf, bufsz);
memmove(conn_api.rd_buf, &conn_api.rd_buf[buffered], bufsz - buffered);
bufsz -= buffered;
pthread_mutex_unlock(&(conn_inbuf.mutex));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment