Merge patch from JeremyF:

23-intercept-select-poll

Do the intercept thing for select and poll.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1298 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/arch/x86-linux/vg_libpthread.c b/coregrind/arch/x86-linux/vg_libpthread.c
index 7d5a789..600d198 100644
--- a/coregrind/arch/x86-linux/vg_libpthread.c
+++ b/coregrind/arch/x86-linux/vg_libpthread.c
@@ -2394,12 +2394,11 @@
      kernel's error numbers (VKI_EINTR etc).
 */
 
-/* __attribute__((weak)) */
-int select ( int n, 
-             fd_set *rfds, 
-             fd_set *wfds, 
-             fd_set *xfds, 
-             struct timeval *timeout )
+int VGL_(select) ( int n, 
+		   fd_set *rfds, 
+		   fd_set *wfds, 
+		   fd_set *xfds, 
+		   struct timeval *timeout )
 {
    unsigned int ms_now, ms_end;
    int    res;
@@ -2543,8 +2542,7 @@
 #endif
 
 
-/* __attribute__((weak)) */
-int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
+int VGL_(poll) (struct pollfd *__fds, nfds_t __nfds, int __timeout)
 {
    unsigned int        ms_now, ms_end;
    int                 res, i;
@@ -3340,8 +3338,6 @@
 strong_alias(write, __write)
 strong_alias(connect, __connect)
 strong_alias(send, __send)
-strong_alias(poll, __poll)
-strong_alias(select, __select)
 
 weak_alias (__pread64, pread64)
 weak_alias (__pwrite64, pwrite64)
diff --git a/coregrind/vg_intercept.c b/coregrind/vg_intercept.c
index fd481ed..402a17b 100644
--- a/coregrind/vg_intercept.c
+++ b/coregrind/vg_intercept.c
@@ -117,12 +117,97 @@
 
 WEAK int VGL_(recv)(int s, void *buf, size_t len, int flags)
 {
-     return __libc_recv(s, buf, len, flags);
+   return __libc_recv(s, buf, len, flags);
 }
 
 int recv(int s, void *buf, size_t len, int flags)
 {
-     return VGL_(recv)(s, buf, len, flags);
+   return VGL_(recv)(s, buf, len, flags);
 }
 
 strong_alias(recv, __recv)
+
+/* -------------------------------- poll -------------------------------- */
+
+static inline
+int my_do_syscall3 ( int syscallno, 
+                     int arg1, int arg2, int arg3 )
+{ 
+   int __res;
+   __asm__ volatile ("pushl %%ebx; movl %%esi,%%ebx ; int $0x80 ; popl %%ebx"
+                     : "=a" (__res)
+                     : "0" (syscallno),
+                       "S" (arg1),
+                       "c" (arg2),
+                       "d" (arg3) );
+   return __res;
+}
+
+#include <sys/poll.h>
+
+#ifndef HAVE_NFDS_T
+typedef unsigned long int nfds_t;
+#endif
+
+
+WEAK int VGL_(poll)(struct pollfd *__fds, nfds_t __nfds, int __timeout)
+{
+   int res = my_do_syscall3(__NR_poll, (int)__fds, __nfds, __timeout);
+
+   if (is_kerror(res)) {
+      * (__errno_location()) = -res;
+      return -1;
+   }
+   return res;
+}
+
+int poll(struct pollfd *__fds, nfds_t __nfds, int __timeout)
+{
+   return VGL_(poll)(__fds, __nfds, __timeout);
+}
+
+strong_alias(poll, __poll)
+
+
+/* -------------------------------- select -------------------------------- */
+
+
+static inline
+int my_do_syscall1 ( int syscallno, int arg1 )
+{ 
+   int __res;
+   __asm__ volatile ("pushl %%ebx; movl %%edx,%%ebx ; int $0x80 ; popl %%ebx"
+                     : "=a" (__res)
+                     : "0" (syscallno),
+                       "d" (arg1) );
+   return __res;
+}
+
+
+WEAK int VGL_(select)( int n, 
+		       fd_set* readfds, 
+		       fd_set* writefds, 
+		       fd_set* exceptfds, 
+		       struct timeval * timeout )
+{
+   int res;
+   int args[5];
+   args[0] = n;
+   args[1] = (int)readfds;
+   args[2] = (int)writefds;
+   args[3] = (int)exceptfds;
+   args[4] = (int)timeout;
+   res = my_do_syscall1(__NR_select, (int)(&(args[0])) );
+   return res;
+}
+
+int select ( int n, 
+             fd_set *rfds, 
+             fd_set *wfds, 
+             fd_set *xfds, 
+             struct timeval *timeout )
+{
+   return VGL_(select)(n, rfds, wfds, xfds, timeout);
+}
+
+strong_alias(select, __select)
diff --git a/coregrind/vg_libpthread.c b/coregrind/vg_libpthread.c
index 7d5a789..600d198 100644
--- a/coregrind/vg_libpthread.c
+++ b/coregrind/vg_libpthread.c
@@ -2394,12 +2394,11 @@
      kernel's error numbers (VKI_EINTR etc).
 */
 
-/* __attribute__((weak)) */
-int select ( int n, 
-             fd_set *rfds, 
-             fd_set *wfds, 
-             fd_set *xfds, 
-             struct timeval *timeout )
+int VGL_(select) ( int n, 
+		   fd_set *rfds, 
+		   fd_set *wfds, 
+		   fd_set *xfds, 
+		   struct timeval *timeout )
 {
    unsigned int ms_now, ms_end;
    int    res;
@@ -2543,8 +2542,7 @@
 #endif
 
 
-/* __attribute__((weak)) */
-int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
+int VGL_(poll) (struct pollfd *__fds, nfds_t __nfds, int __timeout)
 {
    unsigned int        ms_now, ms_end;
    int                 res, i;
@@ -3340,8 +3338,6 @@
 strong_alias(write, __write)
 strong_alias(connect, __connect)
 strong_alias(send, __send)
-strong_alias(poll, __poll)
-strong_alias(select, __select)
 
 weak_alias (__pread64, pread64)
 weak_alias (__pwrite64, pwrite64)