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,23 +1,27 @@
#include "http_server.h" #include "http_server.h"
#include "request.h"
#include "application.h" #include "application.h"
#include "request.h"
#define LOG_VERBOSE 0 #define LOG_VERBOSE 0
void HTTPServer::http_callback_handler(Request *request) { void HTTPServer::http_callback_handler(Request *request) {
Application::handle_request(request); Application::handle_request(request);
} }
void HTTPServer::httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session) { 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(); Request *request = RequestPool::get_request();
HttpSession *s = session.get(); HttpSession *s = session.get();
lock.lock();
_request_map[s] = request; _request_map[s] = request;
lock.unlock();
request->http_parser = std::make_shared<HTTPParser>(httpParser); request->http_parser = std::make_shared<HTTPParser>(httpParser);
request->session = session; request->session = session;
request->setup_url_stack(); request->setup_url_stack();
@ -25,7 +29,7 @@ void HTTPServer::httpEnterCallbackDefault(const HTTPParser &httpParser, const Ht
std::cout << "method:" << http_method_str(static_cast<http_method>(httpParser.method())) << std::endl; std::cout << "method:" << http_method_str(static_cast<http_method>(httpParser.method())) << std::endl;
#endif #endif
http_callback_handler(request); http_callback_handler(request);
} }
void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload) { void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload) {
@ -43,17 +47,22 @@ void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, Web
void HTTPServer::closedCallbackDefault(const HttpSession::Ptr &session) { void HTTPServer::closedCallbackDefault(const HttpSession::Ptr &session) {
HttpSession *s = session.get(); HttpSession *s = session.get();
std::unique_lock<std::mutex> lock(_request_map_mutex, std::defer_lock);
lock.lock();
Request *r = _request_map[s]; Request *r = _request_map[s];
if (r == nullptr) { if (r == nullptr) {
printf("Error HTTPServer::closedCallbackDefault: r == nullptr!"); lock.unlock();
_request_map.erase(s); printf("Error HTTPServer::closedCallbackDefault: r == nullptr!\n");
return; return;
} }
r->connection_closed = true;
_request_map.erase(s); _request_map.erase(s);
lock.unlock();
r->connection_closed = true;
} }
void HTTPServer::configure() { void HTTPServer::configure() {
@ -80,6 +89,7 @@ void HTTPServer::initialize() {
listenBuilder->configureSocketOptions({ listenBuilder->configureSocketOptions({
[](TcpSocket &socket) { [](TcpSocket &socket) {
socket.setNodelay(); socket.setNodelay();
socket.setNonblock();
}, },
}); });
@ -121,4 +131,5 @@ HTTPServer::~HTTPServer() {
delete listenBuilder; delete listenBuilder;
} }
std::map<HttpSession*, Request*> HTTPServer::_request_map; std::map<HttpSession *, Request *> HTTPServer::_request_map;
std::mutex HTTPServer::_request_map_mutex;

View File

@ -3,8 +3,9 @@
#include <condition_variable> #include <condition_variable>
#include <iostream> #include <iostream>
#include <string>
#include <map> #include <map>
#include <mutex>
#include <string>
#include <brynet/base/AppStatus.hpp> #include <brynet/base/AppStatus.hpp>
#include <brynet/net/http/HttpFormat.hpp> #include <brynet/net/http/HttpFormat.hpp>
@ -24,24 +25,25 @@ public:
int port; int port;
int threads; int threads;
std::shared_ptr<TcpService> service; std::shared_ptr<TcpService> service;
wrapper::HttpListenerBuilder *listenBuilder; wrapper::HttpListenerBuilder *listenBuilder;
static void http_callback_handler(Request *response); static void http_callback_handler(Request *response);
static void httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session); static void httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session);
static void wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload); static void wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload);
static void closedCallbackDefault(const HttpSession::Ptr &session); static void closedCallbackDefault(const HttpSession::Ptr &session);
virtual void configure(); virtual void configure();
virtual void initialize(); virtual void initialize();
void main_loop(); void main_loop();
HTTPServer(); HTTPServer();
virtual ~HTTPServer(); virtual ~HTTPServer();
protected: protected:
static std::map<HttpSession*, Request*> _request_map; static std::map<HttpSession *, Request *> _request_map;
static std::mutex _request_map_mutex;
}; };
#endif #endif