diff --git a/src/runner/pythonpluginwrapper.cpp b/src/runner/pythonpluginwrapper.cpp index 2208f46..1c0677e 100644 --- a/src/runner/pythonpluginwrapper.cpp +++ b/src/runner/pythonpluginwrapper.cpp @@ -99,7 +99,6 @@ QList PythonPluginWrapper::settings() const try { boost::python::object l = m_SettingsFunction(); if (!l.is_none()) { -// boost::python::list l = extract(temp); for (int i = 0; i < boost::python::len(l); ++i) { result.append(extract(l[i])); } diff --git a/src/runner/pythonrunner.cpp b/src/runner/pythonrunner.cpp index e4c6a5b..d5c3bbd 100644 --- a/src/runner/pythonrunner.cpp +++ b/src/runner/pythonrunner.cpp @@ -540,10 +540,8 @@ struct Functor0_converter } void operator()() { - // These GIL calls make it thread safe, may or may not be needed depending on your use case - PyGILState_STATE gstate = PyGILState_Ensure(); + GILock lock; m_Callable(); - PyGILState_Release(gstate); } boost::python::object m_Callable; @@ -583,10 +581,8 @@ struct Functor2_converter } void operator()(const PAR1 ¶m1, const PAR2 ¶m2) { - // These GIL calls make it thread safe, may or may not be needed depending on your use case - PyGILState_STATE gstate = PyGILState_Ensure(); + GILock lock; m_Callable(param1, param2); - PyGILState_Release(gstate); } boost::python::object m_Callable; @@ -643,32 +639,37 @@ BOOST_PYTHON_MODULE(mobase) .value("candidate", MOBase::VersionInfo::RELEASE_CANDIDATE) .value("beta", MOBase::VersionInfo::RELEASE_BETA) .value("alpha", MOBase::VersionInfo::RELEASE_ALPHA) - .value("prealpha", MOBase::VersionInfo::RELEASE_PREALPHA); + .value("prealpha", MOBase::VersionInfo::RELEASE_PREALPHA) + ; bpy::enum_("InstallResult") .value("success", MOBase::IPluginInstaller::RESULT_SUCCESS) .value("failed", MOBase::IPluginInstaller::RESULT_FAILED) .value("canceled", MOBase::IPluginInstaller::RESULT_CANCELED) .value("manualRequested", MOBase::IPluginInstaller::RESULT_MANUALREQUESTED) - .value("notAttempted", MOBase::IPluginInstaller::RESULT_NOTATTEMPTED); + .value("notAttempted", MOBase::IPluginInstaller::RESULT_NOTATTEMPTED) + ; bpy::enum_("GameType") .value("oblivion", MOBase::IGameInfo::TYPE_OBLIVION) .value("fallout3", MOBase::IGameInfo::TYPE_FALLOUT3) .value("falloutnv", MOBase::IGameInfo::TYPE_FALLOUTNV) - .value("skyrim", MOBase::IGameInfo::TYPE_SKYRIM); + .value("skyrim", MOBase::IGameInfo::TYPE_SKYRIM) + ; bpy::class_("VersionInfo") .def(bpy::init()) .def("parse", &MOBase::VersionInfo::parse) - .def("canonicalString", &MOBase::VersionInfo::canonicalString); + .def("canonicalString", &MOBase::VersionInfo::canonicalString) + ; bpy::class_("PluginSetting", bpy::init()); bpy::class_("GameInfo") .def("type", bpy::pure_virtual(&MOBase::IGameInfo::type)) .def("path", bpy::pure_virtual(&MOBase::IGameInfo::path)) - .def("binaryName", bpy::pure_virtual(&MOBase::IGameInfo::binaryName)); + .def("binaryName", bpy::pure_virtual(&MOBase::IGameInfo::binaryName)) + ; bpy::class_("IOrganizer") .def("gameInfo", bpy::pure_virtual(&MOBase::IOrganizer::gameInfo), bpy::return_value_policy()) @@ -702,12 +703,14 @@ BOOST_PYTHON_MODULE(mobase) .def("requestDownloadURL", &ModRepositoryBridgeWrapper::requestDownloadURL) .def("requestToggleEndorsement", &ModRepositoryBridgeWrapper::requestToggleEndorsement) .def("onFilesAvailable", &ModRepositoryBridgeWrapper::onFilesAvailable) - .def("onRequestFailed", &ModRepositoryBridgeWrapper::onRequestFailed); + .def("onRequestFailed", &ModRepositoryBridgeWrapper::onRequestFailed) + ; bpy::class_("IDownloadManager") .def("startDownloadURLs", bpy::pure_virtual(&IDownloadManager::startDownloadURLs)) .def("startDownloadNexusFile", bpy::pure_virtual(&IDownloadManager::startDownloadNexusFile)) - .def("downloadPath", bpy::pure_virtual(&IDownloadManager::downloadPath)); + .def("downloadPath", bpy::pure_virtual(&IDownloadManager::downloadPath)) + ; bpy::class_("IInstallationManager") .def("extractFile", bpy::pure_virtual(&IInstallationManager::extractFile)) @@ -733,18 +736,22 @@ BOOST_PYTHON_MODULE(mobase) .value("good", MOBase::GUESS_GOOD) .value("meta", MOBase::GUESS_META) .value("preset", MOBase::GUESS_PRESET) - .value("user", MOBase::GUESS_USER); + .value("user", MOBase::GUESS_USER) + ; bpy::class_, boost::noncopyable>("GuessedString") .def("update", static_cast &(GuessedValue::*)(const QString&, EGuessQuality)>(&GuessedValue::update), bpy::return_value_policy(), updateWithQuality()) - .def("variants", &MOBase::GuessedValue::variants, bpy::return_value_policy()); + .def("variants", &MOBase::GuessedValue::variants, bpy::return_value_policy()) + ; bpy::class_("IPluginTool") - .def("setParentWidget", bpy::pure_virtual(&MOBase::IPluginTool::setParentWidget)); + .def("setParentWidget", bpy::pure_virtual(&MOBase::IPluginTool::setParentWidget)) + ; bpy::class_("IPluginInstallerCustom") - .def("setParentWidget", bpy::pure_virtual(&MOBase::IPluginInstallerCustom::setParentWidget)); + .def("setParentWidget", bpy::pure_virtual(&MOBase::IPluginInstallerCustom::setParentWidget)) + ; Functor0_converter(); // converter for the onRefreshed-callback bpy::class_("IPluginList") diff --git a/src/runner/uibasewrappers.h b/src/runner/uibasewrappers.h index dac1a44..8f96647 100644 --- a/src/runner/uibasewrappers.h +++ b/src/runner/uibasewrappers.h @@ -86,13 +86,13 @@ private slots: qCritical("no handler connected"); return; } -// try { + try { GILock lock; m_FilesAvailableHandler(modID, userData, resultData); -// } catch (const boost::python::error_already_set&) { + } catch (const boost::python::error_already_set&) { // qDebug("error"); - //reportPythonError(); -// } + reportPythonError(); + } } void requestFailed(int modID, int fileID, QVariant userData, const QString &errorMessage)