Pārlūkot izejas kodu

Add mutex lock to protect stl map in C++ wrapper

bel 11 gadi atpakaļ
vecāks
revīzija
9899ee6090
1 mainītis faili ar 8 papildinājumiem un 0 dzēšanām
  1. 8 0
      src/CivetServer.cpp

+ 8 - 0
src/CivetServer.cpp

@@ -48,7 +48,9 @@ int CivetServer::requestHandler(struct mg_connection *conn, void *cbdata)
     assert(request_info != NULL);
     CivetServer *me = (CivetServer*) (request_info->user_data);
     assert(me != NULL);
+    mg_lock_context(me->context);
     me->connections[conn] = CivetConnection();
+    mg_unlock_context(me->context);
 
     CivetHandler *handler = (CivetHandler *)cbdata;
 
@@ -97,7 +99,9 @@ void CivetServer::closeHandler(struct mg_connection *conn)
     assert(me != NULL);
 
     if (me->userCloseHandler) me->userCloseHandler(conn);
+    mg_lock_context(me->context);
     me->connections.erase(conn);
+    mg_unlock_context(me->context);
 }
 
 void CivetServer::addHandler(const std::string &uri, CivetHandler *handler)
@@ -172,7 +176,10 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
     assert(ri != NULL);
     CivetServer *me = (CivetServer*) (ri->user_data);
     assert(me != NULL);
+    mg_lock_context(me->context);
     CivetConnection &conobj = me->connections[conn];
+    mg_lock_connection(conn);
+    mg_unlock_context(me->context);
 
     if (conobj.postData != NULL) {
         formParams = conobj.postData;
@@ -198,6 +205,7 @@ CivetServer::getParam(struct mg_connection *conn, const char *name,
         // get requests do store html <form> field values in the http query_string
         formParams = ri->query_string;
     }
+    mg_unlock_connection(conn);
 
     if (formParams != NULL) {
         return getParam(formParams, strlen(formParams), name, dst, occurrence);