diff packages/net/tcpip/current/src/lib/select.c @ 112:02ea4320376c ecos-sw-2000-07-21

Merge from eCos master repository on 2000-07-21-21:01:39-BST
author jlarmour
date Fri, 21 Jul 2000 21:34:11 +0000
parents ced4577552cd
children 0c2b7be0d798
line wrap: on
line diff
--- a/packages/net/tcpip/current/src/lib/select.c
+++ b/packages/net/tcpip/current/src/lib/select.c
@@ -139,20 +139,19 @@ static int
                 return 0;
             }
             flag = cyg_flag_timed_wait(&select_flag, wait_flag,
-                                       CYG_FLAG_WAITMODE_OR|CYG_FLAG_WAITMODE_CLR,
+                                       CYG_FLAG_WAITMODE_OR,
                                        then);
         } else {
             // Wait forever (until something happens)
             flag = cyg_flag_wait(&select_flag, wait_flag,
-                                 CYG_FLAG_WAITMODE_OR|CYG_FLAG_WAITMODE_CLR);
+                                 CYG_FLAG_WAITMODE_OR);
         }
         if (flag & SELECT_ABORT) {
             errno = EINTR;
             return -1;
         }
         if (!flag) {
-            errno = ETIMEDOUT;
-            return -1;
+            return 0; // meaning no activity, ergo timeout occurred
         }
     }
     errno = ENOSYS;
@@ -179,7 +178,8 @@ selwakeup(struct selinfo *info)
     cyg_scheduler_lock();  // Need this test to be indivisible
     if (cyg_flag_waiting(&select_flag)) {
         // Signal any threads doing a 'select()' that I/O may be possible
-        cyg_flag_setbits(&select_flag, SELECT_WAKE); 
+        cyg_flag_setbits(&select_flag, SELECT_WAKE);
+        cyg_flag_maskbits(&select_flag,    0      ); // clear all
     }
     cyg_scheduler_unlock();
 }
@@ -217,6 +217,7 @@ cyg_select_abort(void)
     if (cyg_flag_waiting(&select_flag)) {
         // Signal any threads doing a 'select()' that I/O may be possible
         cyg_flag_setbits(&select_flag, SELECT_ABORT); 
+        cyg_flag_maskbits(&select_flag,    0       ); // clear all
     }
     cyg_scheduler_unlock();
 }