-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathPothosModule.cpp
More file actions
140 lines (124 loc) · 4.63 KB
/
PothosModule.cpp
File metadata and controls
140 lines (124 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright (c) 2014-2016 Josh Blum
// SPDX-License-Identifier: BSL-1.0
#include "PothosModule.hpp"
#include <Pothos/Plugin.hpp>
#include <Pothos/Init.hpp>
#include <iostream>
#include <cassert>
#include <cstdlib>
/***********************************************************************
* module utility converters
**********************************************************************/
static Pothos::ProxyEnvironment::Sptr myPythonProxyEnv;
static PyObjectToProxyFcn myPyObjectToProxyFcn;
static ProxyToPyObjectFcn myProxyToPyObjectFcn;
static void initPyObjectUtilityConverters(void)
{
try
{
Pothos::init(); //init here in case python is the caller
std::atexit(&Pothos::deinit);
myPythonProxyEnv = Pothos::ProxyEnvironment::make("python");
myPyObjectToProxyFcn = Pothos::PluginRegistry::get("/proxy_helpers/python/pyobject_to_proxy").getObject().extract<PyObjectToProxyFcn>();
myProxyToPyObjectFcn = Pothos::PluginRegistry::get("/proxy_helpers/python/proxy_to_pyobject").getObject().extract<ProxyToPyObjectFcn>();
registerPothosModuleConverters();
}
catch (const Pothos::Exception &ex)
{
std::cerr << "PothosModule init error: " << ex.displayText() << std::endl;
}
}
static void handlePythonPluginEvent(const Pothos::Plugin &plugin, const std::string &event)
{
if (event == "remove" and plugin.getPath() == Pothos::PluginPath("/proxy_helpers/python/pyobject_to_proxy"))
{
myPythonProxyEnv.reset();
myPyObjectToProxyFcn = PyObjectToProxyFcn();
Pothos::PluginRegistry::remove("/proxy/converters/python/proxy_to_pyproxy");
}
if (event == "remove" and plugin.getPath() == Pothos::PluginPath("/proxy_helpers/python/proxy_to_pyobject"))
{
myPythonProxyEnv.reset();
myProxyToPyObjectFcn = ProxyToPyObjectFcn();
Pothos::PluginRegistry::remove("/proxy/converters/python/pyproxy_to_proxy");
}
}
Pothos::Proxy PyObjectToProxy(PyObject *obj)
{
assert(obj != nullptr);
if (isProxyObject(obj)) return *reinterpret_cast<ProxyObject *>(obj)->proxy;
PyThreadStateLock lock;
return myPyObjectToProxyFcn(myPythonProxyEnv, obj);
}
PyObject *ProxyToPyObject(const Pothos::Proxy &proxy)
{
assert(proxy);
PyThreadStateLock lock;
return myProxyToPyObjectFcn(proxy);
}
Pothos::ProxyEnvironment::Sptr getPythonProxyEnv(void)
{
return myPythonProxyEnv;
}
/***********************************************************************
* converters to and from pothos proxy type
**********************************************************************/
static Pothos::Proxy convertPyProxyToProxy(const Pothos::Proxy &proxy)
{
PyObjectRef ref(ProxyToPyObject(proxy), REF_NEW);
return *reinterpret_cast<ProxyObject *>(ref.obj)->proxy;
}
static Pothos::Proxy convertProxyToPyProxy(Pothos::ProxyEnvironment::Sptr env, const Pothos::Proxy &proxy)
{
PyObjectRef ref(makeProxyObject(proxy), REF_NEW);
PyThreadStateLock lock;
return myPyObjectToProxyFcn(env, ref.obj);
}
void registerPothosModuleConverters(void)
{
Pothos::PluginRegistry::addCall("/proxy_helpers/python", &handlePythonPluginEvent);
Pothos::PluginRegistry::addCall("/proxy/converters/python/proxy_to_pyproxy",
&convertProxyToPyProxy);
Pothos::PluginRegistry::add("/proxy/converters/python/pyproxy_to_proxy",
Pothos::ProxyConvertPair("PothosProxy", &convertPyProxyToProxy));
}
/***********************************************************************
* module error support
**********************************************************************/
static PyObject *PothosModuleError;
/***********************************************************************
* module setup
**********************************************************************/
extern "C" POTHOS_HELPER_DLL_EXPORT
#if PY_MAJOR_VERSION >= 3
PyObject *PyInit_PothosModule(void)
#else
void initPothosModule(void)
#endif
{
initPyObjectUtilityConverters();
#if PY_MAJOR_VERSION >= 3
static PyModuleDef PothosModule = {
PyModuleDef_HEAD_INIT,
"PothosModule",
"Pothos python bindings",
-1,
nullptr, nullptr, nullptr, nullptr, nullptr
};
PyObject *m = PyModule_Create(&PothosModule);
#else
PyObject *m = Py_InitModule("PothosModule", nullptr);
#endif
if (m != nullptr)
{
PothosModuleError = PyErr_NewException((char *)"PothosModule.error", NULL, NULL);
Py_INCREF(PothosModuleError);
PyModule_AddObject(m, "error", PothosModuleError);
registerProxyType(m);
registerProxyCallType(m);
registerProxyEnvironmentType(m);
}
#if PY_MAJOR_VERSION >= 3
return m;
#endif
}