* If you do not wish that, delete this exception notice. */
\f
-/* $Id: coop.c,v 1.27 2001-03-10 03:09:07 mdj Exp $ */
+/* $Id: coop.c,v 1.29 2001-11-04 15:52:29 ela Exp $ */
/* Cooperative thread library, based on QuickThreads */
static pthread_cond_t coop_cond_create;
static pthread_mutex_t coop_mutex_create;
static pthread_t coop_mother;
+static int mother_awake_p = 0;
static coop_t *coop_child;
#endif
const struct timespec *abstime)
{
coop_t *old, *t;
+#ifdef ETIMEDOUT
int res = ETIMEDOUT;
+#elif defined (WSAETIMEDOUT)
+ int res = WSAETIMEDOUT;
+#else
+ int res = 0;
+#endif
/* coop_mutex_unlock (m); */
t = coop_qget (&(m->waiting));
NULL,
dummy_start,
coop_child);
+ mother_awake_p = 0;
do
res = pthread_cond_wait (&coop_cond_create, &coop_mutex_create);
while (res == EINTR);
t->n_keys = 0;
#ifdef GUILE_PTHREAD_COMPAT
coop_child = t;
+ mother_awake_p = 1;
if (coop_quitting_p < 0)
{
coop_quitting_p = 0;
* condition variable because they are not safe against
* pre-emptive switching.
*/
- while (coop_child)
+ while (coop_child || mother_awake_p)
usleep (0);
#else
t->sto = malloc (COOP_STKSIZE);
{
/* We're so cheap. */
scm_thread_sleep (usec / 1000000);
- struct timeval timeout;
return 0; /* Maybe we should calculate actual time slept,
but this is faster... :) */
}