Skip to content

Commit 3fe859d

Browse files
committed
pothos: work on proxy as universally supported in case of failure
1 parent 7fce922 commit 3fe859d

9 files changed

Lines changed: 24 additions & 23 deletions

Pothos/Block.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def __init__(self):
1212
env = ProxyEnvironment("managed")
1313
reg = env.findProxy("Pothos/BlockRegistry")
1414
self._block = reg.callProxy("/blocks/python/python_block")
15-
self._block._setPyBlock(Proxy(Proxy(weakref.proxy(self))))
15+
self._block._setPyBlock(weakref.proxy(self))
1616

1717
def __getattr__(self, name):
1818
return lambda *args: self._block.call(name, *args)

Pothos/Converters.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@
77
/***********************************************************************
88
* Proxy conversions
99
**********************************************************************/
10-
static Pothos::Proxy convertProxyToPyProxy(Pothos::ProxyEnvironment::Sptr, const Pothos::Proxy &proxy)
11-
{
12-
PyObjectRef ref(makeProxyObject(proxy), REF_NEW);
13-
return PyObjectToProxy(ref.obj);
14-
}
15-
1610
static Pothos::Proxy convertPyProxyToProxy(const Pothos::Proxy &proxy)
1711
{
1812
PyObjectRef ref(ProxyToPyObject(proxy), REF_NEW);

Pothos/PothosModule.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,18 @@ static void initPyObjectUtilityConverters(void)
3333
Pothos::Proxy PyObjectToProxy(PyObject *obj)
3434
{
3535
assert(obj != nullptr);
36+
if (isProxyObject(obj)) return *reinterpret_cast<ProxyObject *>(obj)->proxy;
3637
PyThreadStateLock lock;
3738
return myPyObjectToProxyFcn(myPythonProxyEnv, obj);
3839
}
3940

41+
Pothos::Proxy convertProxyToPyProxy(Pothos::ProxyEnvironment::Sptr env, const Pothos::Proxy &proxy)
42+
{
43+
PyObjectRef ref(makeProxyObject(proxy), REF_NEW);
44+
PyThreadStateLock lock;
45+
return myPyObjectToProxyFcn(env, ref.obj);
46+
}
47+
4048
PyObject *ProxyToPyObject(const Pothos::Proxy &proxy)
4149
{
4250
assert(proxy);

Pothos/PothosModule.hpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,8 @@ PyObject *makeProxyObject(const Pothos::Proxy &proxy);
5959
//! utility for c api to check if a proxy
6060
bool isProxyObject(PyObject *obj);
6161

62-
//! Unwrap an already proxied object -- otherwise call PyObjectToProxy()
63-
inline Pothos::Proxy PyObjectToProxyInspect(PyObject *obj)
64-
{
65-
assert(obj != nullptr);
66-
if (isProxyObject(obj)) return *reinterpret_cast<ProxyObject *>(obj)->proxy;
67-
return PyObjectToProxy(obj);
68-
}
62+
//! TODO only exposed for converters
63+
Pothos::Proxy convertProxyToPyProxy(Pothos::ProxyEnvironment::Sptr env, const Pothos::Proxy &proxy);
6964

7065
/***********************************************************************
7166
* Pothos::ProxyCall support

Pothos/ProxyCallType.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ PyObject* ProxyCall_call(ProxyCallObject *self, PyObject *args, PyObject *)
3333
Pothos::ProxyVector proxyArgs;
3434
for (int i = 0; i < PyTuple_Size(args); i++)
3535
{
36-
proxyArgs.push_back(PyObjectToProxyInspect(PyTuple_GetItem(args, i)));
36+
proxyArgs.push_back(PyObjectToProxy(PyTuple_GetItem(args, i)));
3737
}
3838

3939
//make proxy call

Pothos/ProxyType.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ int Proxy_setattr(PyObject *self, PyObject *attr_name, PyObject *v)
8181

8282
//convert args
8383
Pothos::ProxyVector proxyArgs;
84-
proxyArgs.push_back(PyObjectToProxyInspect(v));
84+
proxyArgs.push_back(PyObjectToProxy(v));
8585

8686
auto handle = reinterpret_cast<ProxyObject *>(self)->proxy->getHandle();
8787
Pothos::Proxy proxy;
@@ -124,7 +124,7 @@ static Pothos::Proxy Proxy_callProxyHelper(ProxyObject *self, PyObject *args)
124124
const auto name = PyObjectToProxy(PyTuple_GetItem(args, 0)).convert<std::string>();
125125
for (int i = 1; i < PyTuple_Size(args); i++)
126126
{
127-
proxyArgs.push_back(PyObjectToProxyInspect(PyTuple_GetItem(args, i)));
127+
proxyArgs.push_back(PyObjectToProxy(PyTuple_GetItem(args, i)));
128128
}
129129

130130
PyThreadStateLock lock; //proxy call could be potentially blocking
@@ -203,7 +203,7 @@ PyObject* Proxy_Compare(PyObject *o1, PyObject *o2, int opid)
203203
{
204204
try
205205
{
206-
const int cmp = PyObjectToProxyInspect(o1).compareTo(PyObjectToProxyInspect(o2));
206+
const int cmp = PyObjectToProxy(o1).compareTo(PyObjectToProxy(o2));
207207
return richCompareFromSimple(cmp, opid);
208208
}
209209
catch (const Pothos::Exception &ex)

ProxyHelpers.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "PythonProxy.hpp"
55
#include <Pothos/Plugin.hpp>
6+
#include <cassert>
67

78
/***********************************************************************
89
* PyObject helpers - used in python bindings
@@ -14,6 +15,8 @@ static Pothos::Proxy convertPyObjectToProxy(Pothos::ProxyEnvironment::Sptr env,
1415

1516
static PyObject *convertProxyToPyObject(const Pothos::Proxy &proxy)
1617
{
18+
assert(proxy);
19+
assert(std::dynamic_pointer_cast<PythonProxyHandle>(proxy.getHandle()));
1720
return std::dynamic_pointer_cast<PythonProxyHandle>(proxy.getHandle())->ref.newRef();
1821
}
1922

PythonHandle.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
#include "PythonProxy.hpp"
88

99
PythonProxyHandle::PythonProxyHandle(std::shared_ptr<PythonProxyEnvironment> env, PyObject *obj, const bool borrowed):
10-
env(env), obj(obj), ref(PyObjectRef(obj, borrowed))
10+
env(env), obj(obj)
1111
{
12-
return;
12+
PyGilStateLock lock;
13+
ref = PyObjectRef(obj, borrowed);
1314
}
1415

1516
PythonProxyHandle::~PythonProxyHandle(void)
@@ -143,5 +144,7 @@ Pothos::Proxy PythonProxyHandle::call(const std::string &name, const Pothos::Pro
143144
throw Pothos::ProxyExceptionMessage(errorMsg);
144145
}
145146

146-
return env->makeHandle(result);
147+
auto x = env->makeHandle(result);
148+
if (x.getClassName() == "PothosProxy") return x.convert<Pothos::Proxy>();
149+
return x;
147150
}

PythonProxy.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,12 @@ PythonProxyEnvironment::PythonProxyEnvironment(const Pothos::ProxyEnvironmentArg
4545

4646
Pothos::Proxy PythonProxyEnvironment::makeHandle(PyObject *obj, const bool borrowed)
4747
{
48-
PyGilStateLock lock;
4948
auto env = std::dynamic_pointer_cast<PythonProxyEnvironment>(this->shared_from_this());
5049
return Pothos::Proxy(new PythonProxyHandle(env, obj, borrowed));
5150
}
5251

5352
Pothos::Proxy PythonProxyEnvironment::makeHandle(const PyObjectRef &ref)
5453
{
55-
PyGilStateLock lock;
5654
return this->makeHandle(ref.obj, REF_BORROWED);
5755
}
5856

0 commit comments

Comments
 (0)