Commit 0a61a801 authored by Rafaël Carré's avatar Rafaël Carré
Browse files

drop custom poll

can't reproduce unspecified problem fixed by an unknown author
parent 42264ba7
From 8abbc6677e33228461d8d125d7352b306ea7cf48 Mon Sep 17 00:00:00 2001
From: Dominique Martinet <asmadeus@codewreck.org>
Date: Thu, 2 Jun 2011 12:50:50 +0200
Subject: [PATCH 2/7] Android: use a custom poll(), fixes HTTP playback
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
---
include/vlc_fixups.h | 2 +-
src/network/poll.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 1 deletions(-)
diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
index 0d63194..8a376ad 100644
--- a/include/vlc_fixups.h
+++ b/include/vlc_fixups.h
@@ -274,7 +274,7 @@ struct pollfd
#endif
#ifndef HAVE_POLL
# define poll(a, b, c) vlc_poll(a, b, c)
-#elif defined (HAVE_MAEMO)
+#elif defined (HAVE_MAEMO) || defined (__ANDROID__)
# include <poll.h>
# define poll(a, b, c) vlc_poll(a, b, c)
#endif
diff --git a/src/network/poll.c b/src/network/poll.c
index da78f7f..6dddc0b 100644
--- a/src/network/poll.c
+++ b/src/network/poll.c
@@ -60,6 +60,77 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
return ret;
}
+#elif defined (__ANDROID__)
+# include <vlc_network.h>
+# include <errno.h>
+
+int vlc_poll(struct pollfd *fds, nfds_t numfds, int timeout)
+{
+
+ /* On Android, an interruption (any signal) will cancel a call to poll,
+ * setting errno to EINTR. As a consequence, no need to do anything special
+ * to cancel poll().
+ * Since the cancellation mechanism should call pthread_exit() we just
+ * need to make sure this thread is not cancellable now.
+ */
+ int canc = vlc_savecancel ();
+
+ fd_set read_set;
+ fd_set write_set;
+ fd_set exception_set;
+ nfds_t i;
+ int n;
+ int rc;
+
+ FD_ZERO(&read_set);
+ FD_ZERO(&write_set);
+ FD_ZERO(&exception_set);
+ n = -1;
+ for (i = 0; i < numfds; i++)
+ {
+ if (fds[i].fd < 0)
+ continue;
+ if (fds[i].fd >= FD_SETSIZE) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (fds[i].events & POLLIN) FD_SET(fds[i].fd, &read_set);
+ if (fds[i].events & POLLOUT) FD_SET(fds[i].fd, &write_set);
+ if (fds[i].events & POLLERR) FD_SET(fds[i].fd, &exception_set);
+
+ if (fds[i].fd > n)
+ n = fds[i].fd;
+ };
+ if (n == -1)
+ /* Hey!? Nothing to poll, in fact!!! */
+ return 0;
+
+ if (timeout < 0)
+ rc = select(n+1, &read_set, &write_set, &exception_set, NULL);
+ else
+ {
+ struct timeval tv;
+
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = 1000 * (timeout % 1000);
+ rc = select(n+1, &read_set, &write_set, &exception_set, &tv);
+ }
+ if (rc < 0)
+ return rc;
+ for (i = 0; i < numfds; i++)
+ {
+ fds[i].revents = 0;
+ if (FD_ISSET(fds[i].fd, &read_set)) fds[i].revents |= POLLIN;
+ if (FD_ISSET(fds[i].fd, &write_set)) fds[i].revents |= POLLOUT;
+ if (FD_ISSET(fds[i].fd, &exception_set)) fds[i].revents |= POLLERR;
+ }
+
+ vlc_restorecancel (canc);
+ vlc_testcancel ();
+
+ return rc;
+}
+
#elif defined (HAVE_POLL)
# include <vlc_network.h>
--
1.7.5.4
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment