Hi Aditya,
On Sat, Apr 07, 2018 at 07:59:44AM +0530, Aditya Xavier wrote:
> Hi Christopher,
>
> That is the expected behaviour, however if you try running the sample app I
> gave you would notice the following
> After step 11, I.e initialise the os_mbuf by doing a os_mbuf_get from a
> mempool, the new value is overwritten on the previous value.
>
> I.e
> 1. Accessing the mbuf after doing a free chain, om_data still holds the value.
> 2. Initialising it again by doing a os_mbuf_get is not getting me a clean
> mbuf, rather it holds the previous value and om_mbuf_copyinto merely
> overwrites it. So incase the new string length is smaller, om_data would
> return wrong value.
>
> Am sorry if am not able to explain it properly however I would appreciate it
> if you can test the app once.
I ran your app, and I see nothing unusual in the output. Here is what I
get:
(gdb) r
Starting program:
/mnt/data2/work/micosa/repos/mynewt-core/bin/targets/blinky-sim/app/apps/blinky/blinky.elf
uart0 at /dev/pts/16
UART MBUF Created 1 to 1
Received Value :- abc
Received Length :- 3
Value after Reinit :- abc
Length after Reinit :- 0
Received Value :- hello
Received Length :- 5
Value after Reinit :- hello
Length after Reinit :- 0
Received Value :- gagao
Received Length :- 4
Value after Reinit :- gagao
Length after Reinit :- 0
To get this output, I typed the following strings into the console:
abc
hello
gaga
If I understand correctly, your concern is the following part of the
output:
Received Value :- gagao
Received Length :- 4
Value after Reinit :- gagao
Length after Reinit :- 0
Specifically, you are unsure why:
* The first line contains "gagao" rather than "gaga".
* The third line contains "gagao" rather than "".
Your program uses the `%s` format specifier to print the contents of an
mbuf. This is probably not what you want, for a number of reasons:
* Mbuf contents are not typically null-terminated.
* Mbuf contents are not guaranteed to be contiguous (i.e., multiple
bufers may be chained).
Here is a reliable, if inefficient, way to print an mbuf as a string:
static void
print_mbuf(const struct os_mbuf *om)
{
int i;
for (; om != NULL; om = SLIST_NEXT(om, om_next)) {
for (i = 0; i < om->om_len; i++) {
putchar(om->om_data[i]);
}
}
}
If you are sure the mbuf is not chained, then you don't need the outer
loop.
Chris