On Fri, Oct 14, 2011 at 1:13 AM, Achilleas Anastasopoulos <anas...@umich.edu
> wrote:

> This relates to a previous post regarding the behavior of gr_file_sink
> when it writes to a named pipe and the other side of the pipe stops
> reading.
>
> Currently the bahavior of the block is that it does not catch the
> "errno=32=EPIPE"
> (or any errno!=0 for that matter)
> and thus the work function returns a false number of consumed items
> (for some reason even with a broken pipe it always returns 512 items
> consumed...)
>
> As a result the remaing graph keeps producing samples that are somehow
> falsely
> consumed into the file sink.
>
> I added a couple of lines to check for the errno!=0
>
> Please check and comment.
> I attach 2 python files to check the bahavior of the file sink.
> Firtst do " mkfifo fifo_rx" and then run tx.py and rx.py in different
> shells.
> You can stop start rx.py any number of times and tx.py pauses and
> restarts as well.
>
> Observe though that tx.py consumes cpu even when the pipe is broken
> because it continuosly calls
> the gr_file_sink work function...
>
> Achilleas
>


Achilleas,

I have created ticket #448 about this issue. The basic mechanism of your
patch looks correct, but it's worth having a discussion about the extent of
the errors checked and the behavior when an error occurs. I will add this to
the list of topics to discuss during our next developers' conference call
(next Thursday).

Thanks!
Tom



> ==========
>
> diff --git a/gnuradio-core/src/lib/io/gr_file_sink.cc
> b/gnuradio-core/src/lib/io/gr_file_sink.cc
> index aab0158..52d4c84 100644
> --- a/gnuradio-core/src/lib/io/gr_file_sink.cc
> +++ b/gnuradio-core/src/lib/io/gr_file_sink.cc
> @@ -27,6 +27,8 @@
>  #include <gr_file_sink.h>
>  #include <gr_io_signature.h>
>  #include <stdexcept>
> +#include <cstdio>
> +#include <cerrno>
>
>
>  gr_file_sink_sptr
> @@ -64,9 +66,16 @@ gr_file_sink::work (int noutput_items,
>     return noutput_items;              // drop output on the floor
>
>   while (nwritten < noutput_items){
> +    errno=0;
>     int count = fwrite (inbuf, d_itemsize, noutput_items - nwritten, d_fp);
> -    if (count == 0)    // FIXME add error handling
> +    if (count == EOF){ // FIXME add error handling
> +      //printf("fwrite() returned EOF. Requested %d and wrote
> %d\n",noutput_items - nwritten,count);
>       break;
> +    }
> +    if (errno!=0){     // FIXME add error handling
> +      //printf("fwrite() raised error no = %d. Requested %d and wrote
> %d\n",errno,noutput_items - nwritten,count);
> +      break;
> +    }
>     nwritten += count;
>     inbuf += count * d_itemsize;
>   }
>
> _______________________________________________
> 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