]> sourceware.org Git - newlib-cygwin.git/commitdiff
* cygthread.cc (cygthread::freerange): Set inuse count. Avoid setting ev from
authorChristopher Faylor <me@cgf.cx>
Fri, 7 Nov 2003 18:21:05 +0000 (18:21 +0000)
committerChristopher Faylor <me@cgf.cx>
Fri, 7 Nov 2003 18:21:05 +0000 (18:21 +0000)
h as h would be NULL at this point.
(cygthread::operator new): Issue debugging info when overflowing the thread
pool.
(cygthread::cygthread): Set ev from h here after h has been initialized.

winsup/cygwin/ChangeLog
winsup/cygwin/cygthread.cc
winsup/cygwin/fhandler_disk_file.cc

index 02446f9a0298cf1e984124542b7b5bf6adfa51c1..61dcfb3f9a15686166052cf14833a569045f7722 100644 (file)
@@ -1,3 +1,11 @@
+2003-11-07  Christopher Faylor  <cgf@redhat.com>
+
+       * cygthread.cc (cygthread::freerange): Set inuse count.  Avoid setting
+       ev from h as h would be NULL at this point.
+       (cygthread::operator new): Issue debugging info when overflowing the
+       thread pool.
+       (cygthread::cygthread): Set ev from h here after h has been initialized.
+
 2003-11-06  Corinna Vinschen  <corinna@vinschen.de>
 
        * bsdlib.cc (_vwarnx): New function.
index c4c871cf7542642b3db36a64cf40bdbc5a281255..fa9781e8df36a0da5a2355f9887da449c1b12b9d 100644 (file)
@@ -128,7 +128,7 @@ cygthread::freerange ()
 {
   cygthread *self = (cygthread *) calloc (1, sizeof (*self));
   self->is_freerange = true;
-  self->ev = self->h;
+  self->inuse = 1;
   return self;
 }
 
@@ -153,6 +153,8 @@ new (size_t)
   char buf[1024];
   if (!GetEnvironmentVariable ("CYGWIN_FREERANGE_NOCHECK", buf, sizeof (buf)))
     api_fatal ("Overflowed cygwin thread pool");
+  else
+    thread_printf ("Overflowed cygwin thread pool");
 #endif
 
   info = freerange (); /* exhausted thread pool */
@@ -180,6 +182,8 @@ cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
                        this, 0, &id);
       if (!h)
        api_fatal ("thread handle not set - %p<%p>, %E", h, id);
+      if (is_freerange)
+       ev = h;
       thread_printf ("created thread %p", h);
     }
 }
index 20ed661246ec8c1e3fba05c6bcdd49606642dc6d..743e33b651fdf00b277e5dff4ae183b6577b9599 100644 (file)
@@ -618,50 +618,56 @@ fhandler_disk_file::opendir ()
   else if ((dir->__d_dirname = (char *) malloc (len + 3)) == NULL)
     {
       set_errno (ENOMEM);
-      free (dir);
+      goto free_dir;
     }
   else if ((dir->__d_dirent =
            (struct dirent *) malloc (sizeof (struct dirent))) == NULL)
     {
       set_errno (ENOMEM);
-      free (dir);
-      free (dir->__d_dirname);
+      goto free_dirname;
     }
   else if (access_worker (pc, R_OK) != 0)
-    {
-      free (dir);
-      free (dir->__d_dirname);
-    }
+    goto free_dirent;
   else
     {
       strcpy (dir->__d_dirname, get_win32_name ());
       dir->__d_dirent->d_version = __DIRENT_VERSION;
       cygheap_fdnew fd;
-      if (fd >= 0)
-       {
-         fd = this;
-         fd->set_nohandle (true);
-         dir->__d_dirent->d_fd = fd;
-         dir->__fh = this;
-         /* FindFirstFile doesn't seem to like duplicate /'s. */
-         len = strlen (dir->__d_dirname);
-         if (len == 0 || isdirsep (dir->__d_dirname[len - 1]))
-           strcat (dir->__d_dirname, "*");
-         else
-           strcat (dir->__d_dirname, "\\*");  /**/
-         dir->__d_cookie = __DIRENT_COOKIE;
-         dir->__handle = INVALID_HANDLE_VALUE;
-         dir->__d_position = 0;
-         dir->__d_dirhash = get_namehash ();
-
-         res = dir;
-       }
+
+      if (fd < 0)
+       goto free_dirent;
+
+      fd = this;
+      fd->set_nohandle (true);
+      dir->__d_dirent->d_fd = fd;
+      dir->__fh = this;
+      /* FindFirstFile doesn't seem to like duplicate /'s. */
+      len = strlen (dir->__d_dirname);
+      if (len == 0 || isdirsep (dir->__d_dirname[len - 1]))
+       strcat (dir->__d_dirname, "*");
+      else
+       strcat (dir->__d_dirname, "\\*");  /**/
+      dir->__d_cookie = __DIRENT_COOKIE;
+      dir->__handle = INVALID_HANDLE_VALUE;
+      dir->__d_position = 0;
+      dir->__d_dirhash = get_namehash ();
+
+      res = dir;
+
       if (pc.isencoded ())
        set_encoded ();
     }
 
   syscall_printf ("%p = opendir (%s)", res, get_name ());
   return res;
+
+free_dirent:
+  free (dir->__d_dirent);
+free_dirname:
+  free (dir->__d_dirname);
+free_dir:
+  free (dir);
+  return res;
 }
 
 struct dirent *
This page took 0.037905 seconds and 5 git commands to generate.