Wrap BlockInvoke() calls with a helper function that releases the GIL

* This means that if we BlockInvoke a python callback, we don't end up
  in a deadlock where we're holding the GIL during script execution but
  also waiting on the renderer running (which is trying to acquire the
  GIL before calling the callback).
This commit is contained in:
baldurk
2017-03-28 17:10:48 +01:00
parent cbc27222e2
commit a77fecf44d
+14
View File
@@ -24,6 +24,9 @@ CONTAINER_TYPEMAPS(QMap &)
CONTAINER_TYPEMAPS(QMap *)
CONTAINER_TYPEMAPS(QMap)
// need to ignore the original function and add a helper that releases the python GIL while calling
%ignore IRenderManager::BlockInvoke;
// ignore these functions as we don't map QVariantMap to/from python
%ignore EnvironmentModification::toJSON;
%ignore EnvironmentModification::fromJSON;
@@ -53,6 +56,17 @@ CONTAINER_TYPEMAPS(QMap)
%include "Code/Interface/PersistantConfig.h"
%include "Code/Interface/RemoteHost.h"
// unignore the function from above
%rename("%s") IRenderManager::BlockInvoke;
%extend IRenderManager {
void BlockInvoke(InvokeMethod m) {
Py_BEGIN_ALLOW_THREADS
$self->BlockInvoke(m);
Py_END_ALLOW_THREADS
}
};
%init %{
PyDateTime_IMPORT;
%}