make singleton thread safe

This commit is contained in:
2023-10-30 11:36:59 +01:00
parent 5258e90bae
commit e26acc3676
2 changed files with 8 additions and 7 deletions

View File

@@ -7,9 +7,11 @@
namespace pywrap { namespace pywrap {
PyWrap* PyWrap::wrapper = nullptr; PyWrap* PyWrap::wrapper = nullptr;
std::mutex PyWrap::mutex;
PyWrap* PyWrap::GetInstance() PyWrap* PyWrap::GetInstance()
{ {
std::lock_guard<std::mutex> lock(mutex);
if (wrapper == nullptr) { if (wrapper == nullptr) {
std::cout << "Creando instancia" << std::endl; std::cout << "Creando instancia" << std::endl;
wrapper = new PyWrap(); wrapper = new PyWrap();
@@ -35,15 +37,15 @@ namespace pywrap {
return; return;
} }
std::cout << "No estaba en el mapa" << std::endl; std::cout << "No estaba en el mapa" << std::endl;
module = PyImport_ImportModule(moduleName.c_str()); PyObject* module = PyImport_ImportModule(moduleName.c_str());
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
errorAbort("Could't import module " + moduleName); errorAbort("Could't import module " + moduleName);
} }
classObject = PyObject_GetAttrString(module, className.c_str()); PyObject* classObject = PyObject_GetAttrString(module, className.c_str());
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
errorAbort("Couldn't find class " + className); errorAbort("Couldn't find class " + className);
} }
instance = PyObject_CallObject(classObject, NULL); PyObject* instance = PyObject_CallObject(classObject, NULL);
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
errorAbort("Couldn't create instance of class " + className); errorAbort("Couldn't create instance of class " + className);
} }
@@ -89,7 +91,7 @@ namespace pywrap {
errorAbort("Module " + moduleName + " and class " + className + " not found"); errorAbort("Module " + moduleName + " and class " + className + " not found");
} }
std::cout << "Clase encontrada" << std::endl; std::cout << "Clase encontrada" << std::endl;
instance = std::get<2>(item->second); PyObject* instance = std::get<2>(item->second);
PyObject* result; PyObject* result;
if (!(result = PyObject_CallMethod(instance, method.c_str(), NULL))) if (!(result = PyObject_CallMethod(instance, method.c_str(), NULL)))
errorAbort("Couldn't call method " + method); errorAbort("Couldn't call method " + method);

View File

@@ -4,6 +4,7 @@
#include <string> #include <string>
#include <map> #include <map>
#include <tuple> #include <tuple>
#include <mutex>
namespace pywrap { namespace pywrap {
/* /*
@@ -24,10 +25,8 @@ namespace pywrap {
void errorAbort(const std::string& message); void errorAbort(const std::string& message);
PyStatus initPython(); PyStatus initPython();
static PyWrap* wrapper; static PyWrap* wrapper;
static std::mutex mutex;
std::map<std::pair<std::string, std::string>, std::tuple<PyObject*, PyObject*, PyObject*>> moduleClassMap; std::map<std::pair<std::string, std::string>, std::tuple<PyObject*, PyObject*, PyObject*>> moduleClassMap;
PyObject* module;
PyObject* classObject;
PyObject* instance;
}; };
} /* namespace python */ } /* namespace python */
#endif /* PYWRAP_H */ #endif /* PYWRAP_H */