* 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> 2003-04-03 Christopher Faylor <cgf@redhat.com>
* fhandler_console.cc (CONVERT_LIMIT): Use a size for the 21st century. * 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 */ /* Search the threads array for an empty slot to use */
for (info = threads; info < threads + NTHREADS; info++) 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 #ifdef DEBUGGING
if (info->__name) if (info->__name)
@ -146,7 +148,9 @@ new (size_t)
#endif #endif
goto out; 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, info->h = CreateThread (&sec_none_nih, 0, cygthread::stub, info,
CREATE_SUSPENDED, &info->id); CREATE_SUSPENDED, &info->id);
@ -162,6 +166,7 @@ new (size_t)
info = freerange (); /* exhausted thread pool */ info = freerange (); /* exhausted thread pool */
out: out:
InterlockedExchange ((LPLONG) &info->avail, 0);
cygthread_protect->release (); cygthread_protect->release ();
return info; return info;
} }