+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.
/* 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)
#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);
info = freerange (); /* exhausted thread pool */
out:
+ InterlockedExchange ((LPLONG) &info->avail, 0);
cygthread_protect->release ();
return info;
}