OSDN Git Service

* fhandler.h (struct wsa_event): Define here.
authorcorinna <corinna>
Fri, 28 Jul 2006 08:50:46 +0000 (08:50 +0000)
committercorinna <corinna>
Fri, 28 Jul 2006 08:50:46 +0000 (08:50 +0000)
(class fhandler_socket): Make wsock_evt private again.
(fhandler_socket::wsock_event): New read accessor for wsock_evt.
(fhandler_socket::serial_number): New read accessor to get the
socket's serial number.
(fhandler_socket::ready_for_read): Just return true.
* fhandler_socket.cc (struct wsa_event): Move definition to fhandler.h.
* select.cc (struct socketinf): Add serial number vector.
(start_thread_socket): Identify duplicate sockets by their serial
number, not (wrongly) by their wsock_evt.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/select.cc

index 23aa6dc..787c268 100644 (file)
@@ -1,3 +1,16 @@
+2006-07-28  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler.h (struct wsa_event): Define here.
+       (class fhandler_socket): Make wsock_evt private again.
+       (fhandler_socket::wsock_event): New read accessor for wsock_evt.
+       (fhandler_socket::serial_number): New read accessor to get the
+       socket's serial number.
+       (fhandler_socket::ready_for_read): Just return true.
+       * fhandler_socket.cc (struct wsa_event): Move definition to fhandler.h.
+       * select.cc (struct socketinf): Add serial number vector.
+       (start_thread_socket): Identify duplicate sockets by their serial
+       number, not (wrongly) by their wsock_evt.
+
 2006-07-27  Corinna Vinschen  <corinna@vinschen.de>
 
        * fhandler_socket.cc: Revert misguided attempt to handle FD_CLOSE error
index f03730e..dee16aa 100644 (file)
@@ -378,7 +378,13 @@ class fhandler_mailslot : public fhandler_base
   select_record *select_read (select_record *s);
 };
 
-struct wsa_event;
+struct wsa_event
+{
+  LONG serial_number;
+  long events;
+  int  connect_errorcode;
+  pid_t owner;
+};
 
 class fhandler_socket: public fhandler_base
 {
@@ -389,10 +395,12 @@ class fhandler_socket: public fhandler_base
 
   wsa_event *wsock_events;
   HANDLE wsock_mtx;
- public:
   HANDLE wsock_evt;
+ public:
   bool init_events ();
-  int evaluate_events (const long event_mask, long &events, bool erase);
+  int evaluate_events (const long event_mask, long &events, const bool erase);
+  const HANDLE wsock_event () const { return wsock_evt; }
+  const LONG serial_number () const { return wsock_events->serial_number; }
  private:
   int wait_for_events (const long event_mask);
   void release_events ();
@@ -486,6 +494,7 @@ class fhandler_socket: public fhandler_base
   select_record *select_read (select_record *s);
   select_record *select_write (select_record *s);
   select_record *select_except (select_record *s);
+  int ready_for_read (int, DWORD) { return true; }
   void set_addr_family (int af) {addr_family = af;}
   int get_addr_family () {return addr_family;}
   void set_socket_type (int st) { type = st;}
index 4a5177a..be7f707 100644 (file)
@@ -382,14 +382,6 @@ fhandler_socket::af_local_set_secret (char *buf)
                   connect_secret [2], connect_secret [3]);
 }
 
-struct wsa_event
-{
-  LONG serial_number;
-  long events;
-  int  connect_errorcode;
-  pid_t owner;
-};
-
 /* Maximum number of concurrently opened sockets from all Cygwin processes
    on a machine.  Note that shared sockets (through dup/fork/exec) are
    counted as one socket. */
index e5b50d3..92391c1 100644 (file)
@@ -1286,6 +1286,7 @@ struct socketinf
   {
     cygthread *thread;
     int num_w4;
+    LONG ser_num[MAXIMUM_WAIT_OBJECTS];
     HANDLE w4[MAXIMUM_WAIT_OBJECTS];
     select_record *start;
   };
@@ -1344,13 +1345,18 @@ start_thread_socket (select_record *me, select_stuff *stuff)
   while ((s = s->next))
     if (s->startup == start_thread_socket)
       {
-       HANDLE evt = ((fhandler_socket *) me->fh)->wsock_evt;
-       /* No event/socket should show up multiple times. */
+       /* No event/socket should show up multiple times.  Every socket
+          is uniquely identified by its serial number in the global
+          wsock_events record. */
+       const LONG ser_num = ((fhandler_socket *) me->fh)->serial_number ();
        for (int i = 1; i < si->num_w4; ++i)
-         if (si->w4[i] == evt)
+         if (si->ser_num[i] == ser_num)
            goto continue_outer_loop;
        if (si->num_w4 < MAXIMUM_WAIT_OBJECTS)
-         si->w4[si->num_w4++] = evt;
+         {
+           si->ser_num[si->num_w4] = ser_num;
+           si->w4[si->num_w4++] = ((fhandler_socket *) me->fh)->wsock_event ();
+         }
        else /* for now */
          goto err;
       continue_outer_loop: