python service wrapper: add state management for blocking IO in python
parent
26bec663d2
commit
8b43a644b1
@ -0,0 +1,63 @@
|
|||||||
|
#ifndef PYIEC61850_SERVICEPYTHONWRAPPER_HPP
|
||||||
|
#define PYIEC61850_SERVICEPYTHONWRAPPER_HPP
|
||||||
|
|
||||||
|
#include "iec61850_client.h"
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
|
||||||
|
class PyThreadStateSave
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PyThreadStateSave(void)
|
||||||
|
{
|
||||||
|
if (PyGILState_Check())
|
||||||
|
state = PyEval_SaveThread();
|
||||||
|
else
|
||||||
|
state = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
~PyThreadStateSave(void)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
PyEval_RestoreThread(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
PyThreadState* state;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wrapping of synchronous functions to prevent deadlocks
|
||||||
|
*/
|
||||||
|
static MmsValue*
|
||||||
|
pyWrap_IedConnection_readObject(IedConnection con, IedClientError* error, const char* objRef, FunctionalConstraint fc)
|
||||||
|
{
|
||||||
|
PyThreadStateSave gilStateSave;
|
||||||
|
return IedConnection_readObject(con, error, objRef, fc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pyWrap_IedConnection_writeObject(IedConnection con, IedClientError* error, const char* objectReference,
|
||||||
|
FunctionalConstraint fc, MmsValue* value)
|
||||||
|
{
|
||||||
|
PyThreadStateSave gilStateSave;
|
||||||
|
IedConnection_writeObject(con, error, objectReference, fc, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pyWrap_IedConnection_setRCBValues(IedConnection con, IedClientError* error, ClientReportControlBlock rcb, uint32_t parametersMask,
|
||||||
|
bool singleRequest)
|
||||||
|
{
|
||||||
|
PyThreadStateSave gilStateSave;
|
||||||
|
IedConnection_setRCBValues(con, error, rcb, parametersMask, singleRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ClientReportControlBlock
|
||||||
|
pyWrap_IedConnection_getRCBValues(IedConnection con, IedClientError* error, const char* rcbReference,
|
||||||
|
ClientReportControlBlock updateRcb)
|
||||||
|
{
|
||||||
|
PyThreadStateSave gilStateSave;
|
||||||
|
return IedConnection_getRCBValues(con, error, rcbReference, updateRcb);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue