On Friday 25 March 2005 09:38, Reinhard Nissl wrote:
Hi,
Stefan Taferner wrote:
I'm facing a deadlock situation, when the below code is modified to ignore the "r == 0" cases (= original code in vdr-xine-0.7.2):
r==0 means that there is no data available. Are you sure you want to block in xread until data is available?
Yes, because there is nothing else to do at that point in time.
Ok.
[...]
If you want to wait for data (and keep the non-blocking) you should wait some time (200ms or so). If you are not sure about the cPoller, use the select function with a timeout. Then you get exact error codes and all that.
All I'd like to do is to block until the requested data is ready and "r == 0" should just indicate that the FIFO was closed by xine.
But for any reason, "r == 0" happens still without the FIFO beeing closed. Can someone tell me, how to handle this situation properly?
The read manpage says: On success, the number of bytes read is returned (zero indicates end of file). But you probably already know that.
Here is my version of xread, taken from vdr-xine-0.7.2 with modifications. But it is an untested version of code I wrote at work (still have no vdr at hands).
int cXineRemote::xread(int f, void *b, int n) { int t = 0; void (* const sigPipeHandler)(int) = ::signal(SIGPIPE, SIG_IGN);
while (t < n) {
int r = ::read(f, ((char *)b) + t, n - t);
if (r < 0) { fprintf(stderr, "::read(%d) failed %d: ", n, errno); perror("");
disconnect();
t = -1; break; } else if (r == 0) { // fprintf( stderr, "::read zero bytes\n"); fd_set fds; FD_ZERO(&fds); FD_SET(f, &fds); struct timeval tmout; tmout.tv_sec = 3600; tmout.tv_usec = 0; int rc = select(f+1, &fds, 0, 0, &tmout); fprintf(stderr, "::select returned %d\n", rc); } else t += r; }
::signal(SIGPIPE, sigPipeHandler); return t; }
--Stefan