35 #include <boost/python.hpp>
36namespace bp = boost::python;
46ris::Master::Master() {
47 defSlave_ = ris::Slave::create();
51ris::Master::~Master() {}
54uint32_t ris::Master::slaveCount() {
55 return slaves_.size();
61 std::lock_guard<std::mutex> lock(slaveMtx_);
62 slaves_.push_back(slave);
68 std::lock_guard<std::mutex> lock(slaveMtx_);
70 if (slaves_.size() == 0)
71 return (defSlave_->acceptReq(size, zeroCopyEn));
73 return (slaves_[0]->acceptReq(size, zeroCopyEn));
78 std::vector<ris::SlavePtr> slaves;
79 std::vector<ris::SlavePtr>::reverse_iterator rit;
83 std::lock_guard<std::mutex> lock(slaveMtx_);
87 for (rit = slaves.rbegin(); rit != slaves.rend(); ++rit) (*rit)->acceptFrame(frame);
93 if (frame->bufferCount() == 1) {
100 uint32_t size = frame->getPayload();
103 if (nFrame->bufferCount() != 1) {
107 nFrame->setPayload(size);
119void ris::Master::stop() {}
121void ris::Master::setup_python() {
124 bp::class_<ris::Master, ris::MasterPtr, boost::noncopyable>(
"Master", bp::init<>())
125 .def(
"_addSlave", &ris::Master::addSlave)
126 .def(
"_slaveCount", &ris::Master::slaveCount)
127 .def(
"_reqFrame", &ris::Master::reqFrame)
128 .def(
"_sendFrame", &ris::Master::sendFrame)
129 .def(
"_stop", &ris::Master::stop)
130 .def(
"__eq__", &ris::Master::equalsPy)
131 .def(
"__rshift__", &ris::Master::rshiftPy);
138void ris::Master::equalsPy(boost::python::object p) {
144 lSlv = std::dynamic_pointer_cast<ris::Slave>(shared_from_this());
147 boost::python::extract<ris::MasterPtr> get_master(p);
150 if (get_master.check()) {
154 }
else if (PyObject_HasAttrString(p.ptr(),
"_getStreamMaster")) {
156 boost::python::extract<ris::MasterPtr> get_master(p.attr(
"_getStreamMaster")());
159 if (get_master.check()) {
165 boost::python::extract<ris::SlavePtr> get_slave(p);
168 if (get_slave.check()) {
172 }
else if (PyObject_HasAttrString(p.ptr(),
"_getStreamSlave")) {
174 boost::python::extract<ris::SlavePtr> get_slave(p.attr(
"_getStreamSlave")());
177 if (get_slave.check()) {
182 if (rMst == NULL || rSlv == NULL || lSlv == NULL)
184 "Attempt to use == with an incompatible stream slave"));
188 rMst->addSlave(lSlv);
191bp::object ris::Master::rshiftPy(bp::object p) {
195 boost::python::extract<ris::SlavePtr> get_slave(p);
198 if (get_slave.check()) {
202 }
else if (PyObject_HasAttrString(p.ptr(),
"_getStreamSlave")) {
204 boost::python::extract<ris::SlavePtr> get_slave(p.attr(
"_getStreamSlave")());
207 if (get_slave.check()) {
216 "Attempt to use >> with incompatible stream slave"));
229 lSlv = std::dynamic_pointer_cast<ris::Slave>(shared_from_this());
232 rMst = std::dynamic_pointer_cast<ris::Master>(other);
234 if (rMst == NULL || lSlv == NULL)
236 "Attempt to use == with an incompatible stream slave"));
238 rMst->addSlave(lSlv);
static GeneralError create(std::string src, const char *fmt,...)
Creates a formatted error instance.
RAII helper that releases the Python GIL for a scope.
Random-access byte iterator across a Frame payload.
std::shared_ptr< rogue::interfaces::stream::Master > MasterPtr
Shared pointer alias for Master.
std::shared_ptr< rogue::interfaces::stream::Slave > SlavePtr
Shared pointer alias for Slave.
static void copyFrame(rogue::interfaces::stream::FrameIterator &srcIter, uint32_t size, rogue::interfaces::stream::FrameIterator &dstIter)
Copies bytes between frame iterators.
std::shared_ptr< rogue::interfaces::stream::Frame > FramePtr
Shared pointer alias for Frame.