OSDN Git Service

* dll_init.cc (dll_list::load_after_fork): Don't revert to LoadLibrary if
authorcgf <cgf>
Sun, 2 Mar 2003 18:37:17 +0000 (18:37 +0000)
committercgf <cgf>
Sun, 2 Mar 2003 18:37:17 +0000 (18:37 +0000)
LoadLibraryEx fails.
* dtable.cc (dtable::dec_console_fds): Eliminate.
(dtable::release): Don't treat console specially.
(dtable::build_fhandler): Ditto.
* dtable.h (console_fds): Eliminate.
(dtable::dec_console_fds): Eliminate.
(dtable::inc_console_fds): Eliminate.
* fhandler.h (fhandler_console::open_fhs): New static element.
* fhandler_console.cc (fhandler_console::open): Increment open_fs.
(fhandler_console::close): Call FreeConsole if no more open consoles and ctty
is not associated with the console.
* syscalls.cc (setsid): Simplify check for when to call FreeConsole.
(check_pty_fds): Eliminate definition.
* winsup.h (check_pty_fds): Eliminate declaration.

winsup/cygwin/ChangeLog
winsup/cygwin/dll_init.cc
winsup/cygwin/dtable.cc
winsup/cygwin/dtable.h
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_console.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/winsup.h

index 7aef2ee..5c5d534 100644 (file)
@@ -1,5 +1,23 @@
 2003-03-02  Christopher Faylor  <cgf@redhat.com>
 
+       * dll_init.cc (dll_list::load_after_fork): Don't revert to LoadLibrary
+       if LoadLibraryEx fails.
+       * dtable.cc (dtable::dec_console_fds): Eliminate.
+       (dtable::release): Don't treat console specially.
+       (dtable::build_fhandler): Ditto.
+       * dtable.h (console_fds): Eliminate.
+       (dtable::dec_console_fds): Eliminate.
+       (dtable::inc_console_fds): Eliminate.
+       * fhandler.h (fhandler_console::open_fhs): New static element.
+       * fhandler_console.cc (fhandler_console::open): Increment open_fs.
+       (fhandler_console::close): Call FreeConsole if no more open consoles
+       and ctty is not associated with the console.
+       * syscalls.cc (setsid): Simplify check for when to call FreeConsole.
+       (check_pty_fds): Eliminate definition.
+       * winsup.h (check_pty_fds): Eliminate declaration.
+
+2003-03-02  Christopher Faylor  <cgf@redhat.com>
+
        * dll_init.cc (dll_list::load_after_fork): Fix typo where result of
        LoadLibrary was ignored.
 
index 7400c14..15d50b2 100644 (file)
@@ -308,11 +308,6 @@ dll_list::load_after_fork (HANDLE parent, dll *first)
          HMODULE h = LoadLibraryEx (d.name, NULL, DONT_RESOLVE_DLL_REFERENCES);
 
          if (!h)
-           {
-             unload = false;
-             h = LoadLibrary (d.name);
-           }
-         if (!h)
            system_printf ("can't reload %s", d.name);
          /* See if DLL will load in proper place.  If so, free it and reload
             it the right way.
index 73af42e..3b114a7 100644 (file)
@@ -57,14 +57,6 @@ set_std_handle (int fd)
     SetStdHandle (std_consts[fd], cygheap->fdtab[fd]->get_output_handle ());
 }
 
-void
-dtable::dec_console_fds ()
-{
-  if (console_fds > 0 && !--console_fds &&
-      myself->ctty != TTY_CONSOLE && !check_pty_fds())
-    FreeConsole ();
-}
-
 int
 dtable::extend (int howmuch)
 {
@@ -190,9 +182,6 @@ dtable::release (int fd)
        case FH_SOCKET:
          dec_need_fixup_before ();
          break;
-       case FH_CONSOLE:
-         dec_console_fds ();
-         break;
        }
       delete fds[fd];
       fds[fd] = NULL;
@@ -334,8 +323,7 @@ dtable::build_fhandler (int fd, DWORD dev, char *unix_name,
       case FH_CONSOLE:
       case FH_CONIN:
       case FH_CONOUT:
-       if ((fh = cnew (fhandler_console) ()))
-         inc_console_fds ();
+       fh = cnew (fhandler_console) ();
        break;
       case FH_PTYM:
        fh = cnew (fhandler_pty_master) ();
index 6e382a6..d73288f 100644 (file)
@@ -20,11 +20,10 @@ class dtable
   fhandler_base **fds_on_hold;
   int first_fd_for_open;
   int cnt_need_fixup_before;
-  int console_fds;
 public:
   size_t size;
 
-  dtable () : first_fd_for_open(3), cnt_need_fixup_before(0), console_fds(0) {}
+  dtable () : first_fd_for_open(3), cnt_need_fixup_before(0) {}
   void init () {first_fd_for_open = 3;}
 
   void dec_need_fixup_before ()
@@ -34,12 +33,6 @@ public:
   BOOL need_fixup_before ()
     { return cnt_need_fixup_before > 0; }
 
-  void dec_console_fds ();
-  void inc_console_fds ()
-    { console_fds++; }
-  BOOL has_console_fds ()
-    { return console_fds > 0; }
-
   int vfork_child_dup ();
   void vfork_parent_restore ();
   void vfork_child_fixup ();
index cc6ae7c..0d902ee 100644 (file)
@@ -819,6 +819,7 @@ class fhandler_console: public fhandler_termios
   void set_cursor_maybe ();
 
  public:
+  static int open_fhs;
 
   fhandler_console ();
 
index 3fb9125..34c1c0d 100644 (file)
@@ -89,6 +89,8 @@ static console_state NO_COPY *shared_console_info;
 
 dev_console NO_COPY *fhandler_console::dev_state;
 
+int NO_COPY fhandler_console::open_fhs;
+
 /* Allocate and initialize the shared record for the current console.
    Returns a pointer to shared_console_info. */
 tty_min *
@@ -630,6 +632,8 @@ fhandler_console::open (path_conv *, int flags, mode_t)
 
   TTYCLEARF (RSTCONS);
   set_open_status ();
+  open_fhs++;
+  debug_printf ("incremented open_fhs, now %d", open_fhs);
   debug_printf ("opened conin$ %p, conout$ %p",
                get_io_handle (), get_output_handle ());
 
@@ -643,6 +647,9 @@ fhandler_console::close (void)
   CloseHandle (get_output_handle ());
   set_io_handle (NULL);
   set_output_handle (NULL);
+  if (--open_fhs <= 0 && myself->ctty != FH_CONSOLE)
+    FreeConsole ();
+  debug_printf ("decremented open_fhs, now %d", open_fhs);
   return 0;
 }
 
index 8121c89..453de8c 100644 (file)
@@ -77,23 +77,6 @@ close_all_files (void)
   cygwin_shared->delqueue.process_queue ();
 }
 
-BOOL __stdcall
-check_pty_fds (void)
-{
-  int res = FALSE;
-  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK, "check_pty_fds");
-  fhandler_base *fh;
-  for (int i = 0; i < (int) cygheap->fdtab.size; i++)
-    if ((fh = cygheap->fdtab[i]) != NULL &&
-       (fh->get_device () == FH_TTYS || fh->get_device () == FH_PTYM))
-      {
-       res = TRUE;
-       break;
-      }
-  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK, "check_pty_fds");
-  return res;
-}
-
 int
 dup (int fd)
 {
@@ -302,11 +285,9 @@ setsid (void)
 
   if (myself->pgid != myself->pid)
     {
-      if (myself->ctty == TTY_CONSOLE
-         && !cygheap->fdtab.has_console_fds ()
-         && !check_pty_fds ())
-       FreeConsole ();
       myself->ctty = -1;
+      if (fhandler_console::open_fhs <= 0)
+       FreeConsole ();
       myself->sid = getpid ();
       myself->pgid = getpid ();
       syscall_printf ("sid %d, pgid %d, ctty %d", myself->sid, myself->pgid, myself->ctty);
index f3dce68..9ab895a 100644 (file)
@@ -164,7 +164,6 @@ void events_init (void);
 void events_terminate (void);
 
 void __stdcall close_all_files (void);
-BOOL __stdcall check_pty_fds (void);
 
 /* Invisible window initialization/termination. */
 HWND __stdcall gethwnd (void);