Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-11-07 21:21:05 +0300
committerChristopher Faylor <me@cgf.cx>2003-11-07 21:21:05 +0300
commitef4d65ba95a0a589d28cb778aca87c5aff9378f1 (patch)
tree4a3a0f625e75684070daab9a50fcac6cb2357992 /winsup
parent2985521f84ccc8bf626482d80e4a8c292d5413b9 (diff)
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/cygthread.cc6
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc58
3 files changed, 45 insertions, 27 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 02446f9a0..61dcfb3f9 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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.
diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc
index c4c871cf7..fa9781e8d 100644
--- a/winsup/cygwin/cygthread.cc
+++ b/winsup/cygwin/cygthread.cc
@@ -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);
}
}
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index 20ed66124..743e33b65 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -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 *