* cygthread.cc (operator new): Be more defensive when messing with threads that

are marked "unavailable".
This commit is contained in:
Christopher Faylor 2003-04-04 05:58:06 +00:00
parent a61bf8c369
commit b410f1680f
2 changed files with 12 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2003-04-04 Christopher Faylor <cgf@redhat.com>
* cygthread.cc (operator new): Be more defensive when messing with
threads that are marked "unavailable".
2003-04-03 Christopher Faylor <cgf@redhat.com>
* fhandler_console.cc (CONVERT_LIMIT): Use a size for the 21st century.

View File

@ -136,7 +136,9 @@ new (size_t)
/* Search the threads array for an empty slot to use */
for (info = threads; info < threads + NTHREADS; info++)
if ((id = (DWORD) InterlockedExchange ((LPLONG) &info->avail, 0)))
if ((LONG) (id = (DWORD) InterlockedExchange ((LPLONG) &info->avail, -1)) < 0)
/* being considered */;
else if (id > 0)
{
#ifdef DEBUGGING
if (info->__name)
@ -146,7 +148,9 @@ new (size_t)
#endif
goto out;
}
else if (!info->id)
else if (info->id)
InterlockedExchange ((LPLONG) &info->avail, 0);
else
{
info->h = CreateThread (&sec_none_nih, 0, cygthread::stub, info,
CREATE_SUSPENDED, &info->id);
@ -162,6 +166,7 @@ new (size_t)
info = freerange (); /* exhausted thread pool */
out:
InterlockedExchange ((LPLONG) &info->avail, 0);
cygthread_protect->release ();
return info;
}