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) ...@@ -308,36 +308,43 @@ pty_input_thread(void *args)
{ {
fd_set rds; fd_set rds;
int rd; int rd;
int buffered; size_t buffered;
size_t buffer;
int i; int i;
struct timeval tv; struct timeval tv;
size_t bufsz = 0;
SetThreadName("PTY Input"); SetThreadName("PTY Input");
conn_api.input_thread_running = 1; conn_api.input_thread_running = 1;
while (master != -1 && !conn_api.terminate) { while (master != -1 && !conn_api.terminate) {
if ((i = waitpid(child_pid, &status, WNOHANG))) if ((i = waitpid(child_pid, &status, WNOHANG)))
break; break;
FD_ZERO(&rds); if (bufsz < BUFFER_SIZE) {
FD_SET(master, &rds); FD_ZERO(&rds);
tv.tv_sec = 0; FD_SET(master, &rds);
tv.tv_usec = 100000; tv.tv_sec = 0;
rd = select(master + 1, &rds, NULL, NULL, &tv); if (bufsz)
if (rd == -1) { tv.tv_usec = 0;
if (errno == EBADF) else
break; tv.tv_usec = 100000;
rd = 0; rd = select(master + 1, &rds, NULL, NULL, &tv);
} if (rd == -1) {
if (rd == 1) { if (errno == EBADF)
rd = read(master, conn_api.rd_buf, conn_api.rd_buf_size); break;
if (rd <= 0) rd = 0;
break; }
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; if (bufsz > 0) {
while (buffered < rd && !conn_api.terminate) {
pthread_mutex_lock(&(conn_inbuf.mutex)); pthread_mutex_lock(&(conn_inbuf.mutex));
buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100); conn_buf_wait_free(&conn_inbuf, 1, 100);
buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer); 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)); pthread_mutex_unlock(&(conn_inbuf.mutex));
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment