I like to use the socketpair(2) syscall for this, if you don't really need
a message broker.

--Albin

On Wed, May 29, 2019, 21:26 Brad Hein <linuxb...@gmail.com> wrote:

> Packaging the json string as a vector of u8 integers worked like a charm,
> thank you for the suggestion!
>
> Python code:
> https://gist.github.com/regulatre/38e7162d6f470ad0dbd77b171a69dc79
> C++ block code:
> https://gist.github.com/regulatre/f264fb4751ca3bd8d6b98abf9792e95d
>
> Memory consumption by the python flowgraph is no longer showing signs of
> memory leakage (at least in the 4 hours it's been running :)
>
>
> On Fri, Mar 1, 2019 at 1:50 PM Müller, Marcus (CEL) <muel...@kit.edu>
> wrote:
>
>> Hi Brad,
>>
>> so, yes, your observation is correct: PMT symbols are/were meant to be
>> used as "identifiers", not as "data carriers"; the motivation behind
>> the hash table you find in pmt.cc is that there's only one instance of
>> any given PMT symbol, and thus, a simple address comparison suffices to
>> tell whether two PMT symbols are the same.
>>
>> You'll notice that on x86 (and presumably modern ARM) string comparison
>> is pretty fast, and that you'd need to do *a lot* comparisons to offset
>> the cost of hashing a symbol once. Anyway, yes, that table grows
>> unboundedly.
>>
>> Since your string isn't actually a "symbol", I'd recommend simply
>> encoding it safely (that's probably already the case), and putting it
>> in a uniform PMT vector of 8bit integers (u8vector).
>>
>> On a different note, there's actually "unintended" (as in: I don't
>> intend GNU Radio to have an unbounded hash map, but it's at least what
>> was originally intended) memory leaks with PMTs and tag_t on the
>> Python/C++ boundary, and there's quite some broken concepts within PMT.
>>
>> Long or medium term, we'll be replacing PMT with something that is
>> actually a common serialization format for usage in external software
>> (i.e. not for usage within the same flow graph), and ideally with the
>> unserialized universal container that comes with such a format. Stay
>> tuned. However, not happening in 3.8 or anything before.
>>
>> Best regards,
>> Marcus
>>
>> On Thu, 2019-02-28 at 14:48 -0500, Brad Hein wrote:
>> >
>> > In my gnuradio test application I’m attempting to pass a JSON formatted
>> string from my C++ custom block, to my python flow graph containing the
>> block.
>> >
>> > The String message are being received by my python flow graph, but
>> there’s a memory leak. Over time, my flowgraph RSS (memory footprint) grows
>> at about 32k/s up until the application runs out of memory.
>> >
>> > The leak didn’t start until after I retrofitted my flowgraph and custom
>> block with polymorphic type (PMT) based message passing. I’m passing a 200
>> or so byte JSON string (as a symbol) from C++ block to python flow graph
>> about 60 times per second.
>> >
>> > Sleuthing through the pmt.cc code [1] I see the String (symbol) objects
>> are stored in a hash. I suspect what is happening is that since all of my
>> JSON strings are unique, they’re getting added to the hash and causing the
>> hash to grow unbounded over time.
>> >
>> > From what I can tell by reading the wiki [2], the approach I’m using is
>> the best way to get a string from my custom block and into my python
>> flowgraph.
>> >
>> > [1]
>> https://github.com/gnuradio/gnuradio/blob/master/gnuradio-runtime/lib/pmt/pmt.cc
>> > [2] https://www.gnuradio.org/doc/doxygen/page_pmt.html
>> >
>> >
>> > Sample c++ block code snippet from my work function:
>> >
>> > // Calculate metrics. Occasionally (60/second) we'll get back a JSON
>> formatted string of metrics.
>> > crossingData = calculateWaveCrossingMetrics(lastSampleValue,in[i]);
>> >
>> > if (crossingData.length() > 0) {
>> >   pmt::pmt_t messageString;
>> >   messageString = pmt::string_to_symbol(crossingData.c_str());
>> >   message_port_pub(polymorphicMessageDestination, messageString);
>> >
>> >
>> > Questions:
>> >
>> > 1.     Is this the best way to get a string from my C++ block into my
>> python application?
>> > 2.     Is there a way to pass my messages that doesn’t result in memory
>> growing unbounded?
>> >
>> >
>> > Thank you
>> > Brad
>> >
>> > _______________________________________________
>> > Discuss-gnuradio mailing list
>> > Discuss-gnuradio@gnu.org
>> > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>>
> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to