removed unnecessary helper threads and pipes

This commit is contained in:
overflowerror 2021-04-29 14:52:11 +02:00
parent ced0404557
commit 91ede87e8c
2 changed files with 6 additions and 110 deletions

View file

@ -130,15 +130,6 @@ void cleanup() {
pthread_cancel(connection->threads.response); pthread_cancel(connection->threads.response);
pthread_join(connection->threads.response, NULL); pthread_join(connection->threads.response, NULL);
} }
if (connection->threads.helper[0] != PTHREAD_NULL) {
pthread_cancel(connection->threads.helper[0]);
pthread_join(connection->threads.helper[0], NULL);
}
if (connection->threads.helper[1] != PTHREAD_NULL) {
pthread_cancel(connection->threads.helper[1]);
pthread_join(connection->threads.helper[1], NULL);
}
if (connection->peer.name != NULL) if (connection->peer.name != NULL)
free(connection->peer.name); free(connection->peer.name);
@ -247,9 +238,8 @@ void safeEndConnection(struct connection* connection, bool force) {
stopThread(self, &(connection->threads.request), true); stopThread(self, &(connection->threads.request), true);
stopThread(self, &(connection->threads.response), force); stopThread(self, &(connection->threads.response), force);
stopThread(self, &(connection->threads.helper[0]), force);
stopThread(self, &(connection->threads.helper[1]), force);
// close socket
close(connection->readfd); close(connection->readfd);
close(connection->writefd); close(connection->writefd);
@ -268,7 +258,7 @@ int sendHeader(int statusCode, struct headers* headers, struct request* request)
} }
struct connection* connection = (struct connection*) request->_private; struct connection* connection = (struct connection*) request->_private;
int fd = connection->threads.responseFd; int fd = connection->writefd;
FILE* stream = fdopen(dup(fd), "w"); FILE* stream = fdopen(dup(fd), "w");
if (stream == NULL) { if (stream == NULL) {
@ -284,7 +274,6 @@ int sendHeader(int statusCode, struct headers* headers, struct request* request)
headers_dump(headers, stream); headers_dump(headers, stream);
fprintf(stream, "\r\n"); fprintf(stream, "\r\n");
fclose(stream); fclose(stream);
@ -302,7 +291,7 @@ void* responseThread(void* data) {
connection->threads.handler.handler((struct request) { connection->threads.handler.handler((struct request) {
.metaData = connection->metaData, .metaData = connection->metaData,
.headers = &(connection->headers), .headers = &(connection->headers),
.fd = connection->threads.requestFd, .fd = connection->readfd,
.peer = connection->peer, .peer = connection->peer,
.userData = connection->threads.handler.data, .userData = connection->threads.handler.data,
._private = connection ._private = connection
@ -313,18 +302,12 @@ void* responseThread(void* data) {
debug("networking: response handler returned"); debug("networking: response handler returned");
safeEndConnection(connection, false); safeEndConnection(connection, false);
close(connection->threads.requestFd);
close(connection->threads._responseFd);
close(connection->threads._requestFd);
close(connection->threads.responseFd);
return NULL; return NULL;
} }
/* /*
* This thread handles finding a handler and handles pipes * This thread handles finding a handler and handler timeout
*/ */
void* requestThread(void* data) { void* requestThread(void* data) {
struct connection* connection = (struct connection*) data; struct connection* connection = (struct connection*) data;
@ -340,80 +323,9 @@ void* requestThread(void* data) {
connection->threads.handler = handler; connection->threads.handler = handler;
int pipefd[2];
if (pipe(&(pipefd[0])) < 0) {
error("networking: Couldn't create reponse pipe: %s", strerror(errno));
warn("Aborting request.");
pthread_mutex_lock(&(connection->lock));
connection->state = ABORTED;
connection->inUse--;
pthread_mutex_unlock(&(connection->lock));
return NULL;
}
int request = pipefd[1];
connection->threads._requestFd = request;
connection->threads.requestFd = pipefd[0];
if (pipe(&(pipefd[0])) < 0) {
close(request);
close(connection->threads.requestFd);
error("networking: Couldn't create reponse pipe: %s", strerror(errno));
warn("Aborting request.");
pthread_mutex_lock(&(connection->lock));
connection->state = ABORTED;
connection->inUse--;
pthread_mutex_unlock(&(connection->lock));
return NULL;
}
int response = pipefd[0];
connection->threads._responseFd = response;
connection->threads.responseFd = pipefd[1];
if (startCopyThread(connection->readfd, request, true, &(connection->threads.helper[0])) < 0) {
close(request);
close(connection->threads.requestFd);
close(response);
close(connection->threads.responseFd);
error("networking: Couldn't start helper thread.");
warn("networking: Aborting request.");
pthread_mutex_lock(&(connection->lock));
connection->state = ABORTED;
connection->inUse--;
pthread_mutex_unlock(&(connection->lock));
return NULL;
}
if (startCopyThread(response, connection->writefd, false, &(connection->threads.helper[1])) < 0) {
close(request);
close(connection->threads.requestFd);
close(response);
close(connection->threads.responseFd);
error("networking: Couldn't start helper thread.");
warn("networking: Aborting request.");
pthread_mutex_lock(&(connection->lock));
connection->state = ABORTED;
connection->inUse--;
pthread_mutex_unlock(&(connection->lock));
return NULL;
}
if (pthread_create(&(connection->threads.response), NULL, &responseThread, connection) < 0) { if (pthread_create(&(connection->threads.response), NULL, &responseThread, connection) < 0) {
close(request); close(connection->readfd);
close(connection->threads.requestFd); close(connection->writefd);
close(response);
close(connection->threads.responseFd);
error("networking: Couldn't start response thread."); error("networking: Couldn't start response thread.");
warn("networking: Aborting request."); warn("networking: Aborting request.");
@ -433,10 +345,6 @@ void* requestThread(void* data) {
error("networking: Timeout of handler."); error("networking: Timeout of handler.");
error("networking: Aborting"); error("networking: Aborting");
close(request);
close(connection->threads.requestFd);
close(response);
close(connection->threads.responseFd);
safeEndConnection(connection, true); safeEndConnection(connection, true);
@ -816,14 +724,7 @@ void* listenThread(void* _bind) {
.request = PTHREAD_NULL, .request = PTHREAD_NULL,
.response = PTHREAD_NULL, .response = PTHREAD_NULL,
.handler = {}, .handler = {},
.requestFd = -1,
.responseFd = -1,
._requestFd = -1,
._responseFd = -1
}; };
// TODO see above
connection->threads.helper[0] = PTHREAD_NULL;
connection->threads.helper[1] = PTHREAD_NULL;
connection->currentHeaderLength = 0; connection->currentHeaderLength = 0;
connection->currentHeader = NULL; connection->currentHeader = NULL;
connection->inUse = 0; connection->inUse = 0;

View file

@ -35,12 +35,7 @@ typedef struct handler (*handlerGetter_t)(struct metaData metaData, const char*
struct threads { struct threads {
pthread_t request; pthread_t request;
pthread_t response; pthread_t response;
pthread_t helper[2];
struct handler handler; struct handler handler;
int requestFd;
int responseFd;
int _requestFd;
int _responseFd;
}; };
struct connection { struct connection {