summaryrefslogtreecommitdiff
path: root/libguile/threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/threads.c')
-rw-r--r--libguile/threads.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/libguile/threads.c b/libguile/threads.c
index 91b18b43a..48a91e84f 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -307,29 +307,24 @@ block_self (SCM queue, scm_i_pthread_mutex_t *mutex,
SCM q_handle;
int err;
- if (scm_i_setup_sleep (t, mutex, -1))
- {
- scm_i_reset_sleep (t);
- err = EINTR;
- }
+ if (scm_i_prepare_to_wait_on_cond (t, mutex, &t->sleep_cond))
+ return EINTR;
+
+ t->block_asyncs++;
+ q_handle = enqueue (queue, t->handle);
+ if (waittime == NULL)
+ err = scm_i_scm_pthread_cond_wait (&t->sleep_cond, mutex);
else
- {
- t->block_asyncs++;
- q_handle = enqueue (queue, t->handle);
- if (waittime == NULL)
- err = scm_i_scm_pthread_cond_wait (&t->sleep_cond, mutex);
- else
- err = scm_i_scm_pthread_cond_timedwait (&t->sleep_cond, mutex, waittime);
+ err = scm_i_scm_pthread_cond_timedwait (&t->sleep_cond, mutex, waittime);
- /* When we are still on QUEUE, we have been interrupted. We
- report this only when no other error (such as a timeout) has
- happened above.
- */
- if (remqueue (queue, q_handle) && err == 0)
- err = EINTR;
- t->block_asyncs--;
- scm_i_reset_sleep (t);
- }
+ /* When we are still on QUEUE, we have been interrupted. We
+ report this only when no other error (such as a timeout) has
+ happened above.
+ */
+ if (remqueue (queue, q_handle) && err == 0)
+ err = EINTR;
+ t->block_asyncs--;
+ scm_i_wait_finished (t);
return err;
}
@@ -1479,11 +1474,8 @@ scm_std_select (int nfds,
readfds = &my_readfds;
}
- while (scm_i_setup_sleep (t, NULL, t->sleep_pipe[1]))
- {
- scm_i_reset_sleep (t);
- SCM_TICK;
- }
+ while (scm_i_prepare_to_wait_on_fd (t, t->sleep_pipe[1]))
+ SCM_TICK;
wakeup_fd = t->sleep_pipe[0];
FD_SET (wakeup_fd, readfds);
@@ -1502,7 +1494,7 @@ scm_std_select (int nfds,
res = args.result;
eno = args.errno_value;
- scm_i_reset_sleep (t);
+ scm_i_wait_finished (t);
if (res > 0 && FD_ISSET (wakeup_fd, readfds))
{