Added a mutex for writing/reading _request_map in HTTPServer.

This commit is contained in:
Relintai 2021-02-09 09:48:08 +01:00
parent 67e740e35b
commit 23d085794c
2 changed files with 30 additions and 17 deletions

View File

@ -1,7 +1,7 @@
#include "http_server.h"
#include "request.h"
#include "application.h"
#include "request.h"
#define LOG_VERBOSE 0
@ -10,11 +10,15 @@ void HTTPServer::http_callback_handler(Request *request) {
}
void HTTPServer::httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session) {
std::unique_lock<std::mutex> lock(_request_map_mutex, std::defer_lock);
Request *request = RequestPool::get_request();
HttpSession *s = session.get();
lock.lock();
_request_map[s] = request;
lock.unlock();
request->http_parser = std::make_shared<HTTPParser>(httpParser);
request->session = session;
@ -43,17 +47,22 @@ void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, Web
void HTTPServer::closedCallbackDefault(const HttpSession::Ptr &session) {
HttpSession *s = session.get();
std::unique_lock<std::mutex> lock(_request_map_mutex, std::defer_lock);
lock.lock();
Request *r = _request_map[s];
if (r == nullptr) {
printf("Error HTTPServer::closedCallbackDefault: r == nullptr!");
_request_map.erase(s);
lock.unlock();
printf("Error HTTPServer::closedCallbackDefault: r == nullptr!\n");
return;
}
r->connection_closed = true;
_request_map.erase(s);
lock.unlock();
r->connection_closed = true;
}
void HTTPServer::configure() {
@ -80,6 +89,7 @@ void HTTPServer::initialize() {
listenBuilder->configureSocketOptions({
[](TcpSocket &socket) {
socket.setNodelay();
socket.setNonblock();
},
});
@ -122,3 +132,4 @@ HTTPServer::~HTTPServer() {
}
std::map<HttpSession *, Request *> HTTPServer::_request_map;
std::mutex HTTPServer::_request_map_mutex;

View File

@ -3,8 +3,9 @@
#include <condition_variable>
#include <iostream>
#include <string>
#include <map>
#include <mutex>
#include <string>
#include <brynet/base/AppStatus.hpp>
#include <brynet/net/http/HttpFormat.hpp>
@ -42,6 +43,7 @@ public:
protected:
static std::map<HttpSession *, Request *> _request_map;
static std::mutex _request_map_mutex;
};
#endif