diff options
author | Christopher Faylor <me@cgf.cx> | 2003-11-07 21:21:05 +0300 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-11-07 21:21:05 +0300 |
commit | ef4d65ba95a0a589d28cb778aca87c5aff9378f1 (patch) | |
tree | 4a3a0f625e75684070daab9a50fcac6cb2357992 /winsup | |
parent | 2985521f84ccc8bf626482d80e4a8c292d5413b9 (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/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/cygthread.cc | 6 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 58 |
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 * |