summaryrefslogtreecommitdiff
path: root/libguile/async.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2011-05-13 12:15:42 +0200
committerAndy Wingo <wingo@pobox.com>2011-05-13 13:48:07 +0200
commitc98ce8f59994f596e3ea574091c01439cb629308 (patch)
tree7b88df90e6c5981a5c1b5f7be807a6ecfdd71150 /libguile/async.c
parent2e16a342f226b97e47fd2cd30c367ebca2a3080c (diff)
downloadguile-c98ce8f59994f596e3ea574091c01439cb629308.tar.gz
async.c refactor
* libguile/async.c (increase_block, decrease_block): Write more clearly. (scm_dynwind_block_asyncs, scm_dynwind_unblock_asyncs): Move definitions up. (scm_call_with_blocked_asyncs, scm_c_call_with_blocked_asyncs) (scm_call_with_unblocked_asyncs, scm_c_call_with_unblocked_asyncs): Implement in terms of scm_dynwind_{un,}block_asyncs, so that we don't stuff SCM values into pointers.
Diffstat (limited to 'libguile/async.c')
-rw-r--r--libguile/async.c94
1 files changed, 55 insertions, 39 deletions
diff --git a/libguile/async.c b/libguile/async.c
index 141244874..66f0b04cd 100644
--- a/libguile/async.c
+++ b/libguile/async.c
@@ -385,16 +385,37 @@ SCM_DEFINE (scm_mask_signals, "mask-signals", 0, 0, 0,
static void
increase_block (void *data)
{
- ((scm_i_thread *)data)->block_asyncs++;
+ scm_i_thread *t = data;
+ t->block_asyncs++;
}
static void
decrease_block (void *data)
{
- if (--((scm_i_thread *)data)->block_asyncs == 0)
+ scm_i_thread *t = data;
+ if (--t->block_asyncs == 0)
scm_async_click ();
}
+void
+scm_dynwind_block_asyncs (void)
+{
+ scm_i_thread *t = SCM_I_CURRENT_THREAD;
+ scm_dynwind_rewind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY);
+ scm_dynwind_unwind_handler (decrease_block, t, SCM_F_WIND_EXPLICITLY);
+}
+
+void
+scm_dynwind_unblock_asyncs (void)
+{
+ scm_i_thread *t = SCM_I_CURRENT_THREAD;
+ if (t->block_asyncs == 0)
+ scm_misc_error ("scm_with_unblocked_asyncs",
+ "asyncs already unblocked", SCM_EOL);
+ scm_dynwind_rewind_handler (decrease_block, t, SCM_F_WIND_EXPLICITLY);
+ scm_dynwind_unwind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY);
+}
+
SCM_DEFINE (scm_call_with_blocked_asyncs, "call-with-blocked-asyncs", 1, 0, 0,
(SCM proc),
"Call @var{proc} with no arguments and block the execution\n"
@@ -402,22 +423,28 @@ SCM_DEFINE (scm_call_with_blocked_asyncs, "call-with-blocked-asyncs", 1, 0, 0,
"it is running. Return the value returned by @var{proc}.\n")
#define FUNC_NAME s_scm_call_with_blocked_asyncs
{
- return scm_internal_dynamic_wind (increase_block,
- (scm_t_inner) scm_call_0,
- decrease_block,
- (void *)proc,
- SCM_I_CURRENT_THREAD);
+ SCM ans;
+
+ scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
+ scm_dynwind_block_asyncs ();
+ ans = scm_call_0 (proc);
+ scm_dynwind_end ();
+
+ return ans;
}
#undef FUNC_NAME
void *
scm_c_call_with_blocked_asyncs (void *(*proc) (void *data), void *data)
{
- return (void *)scm_internal_dynamic_wind (increase_block,
- (scm_t_inner) proc,
- decrease_block,
- data,
- SCM_I_CURRENT_THREAD);
+ void* ans;
+
+ scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
+ scm_dynwind_block_asyncs ();
+ ans = proc (data);
+ scm_dynwind_end ();
+
+ return ans;
}
@@ -428,46 +455,35 @@ SCM_DEFINE (scm_call_with_unblocked_asyncs, "call-with-unblocked-asyncs", 1, 0,
"it is running. Return the value returned by @var{proc}.\n")
#define FUNC_NAME s_scm_call_with_unblocked_asyncs
{
+ SCM ans;
+
if (SCM_I_CURRENT_THREAD->block_asyncs == 0)
SCM_MISC_ERROR ("asyncs already unblocked", SCM_EOL);
- return scm_internal_dynamic_wind (decrease_block,
- (scm_t_inner) scm_call_0,
- increase_block,
- (void *)proc,
- SCM_I_CURRENT_THREAD);
+
+ scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
+ scm_dynwind_unblock_asyncs ();
+ ans = scm_call_0 (proc);
+ scm_dynwind_end ();
+
+ return ans;
}
#undef FUNC_NAME
void *
scm_c_call_with_unblocked_asyncs (void *(*proc) (void *data), void *data)
{
+ void* ans;
+
if (SCM_I_CURRENT_THREAD->block_asyncs == 0)
scm_misc_error ("scm_c_call_with_unblocked_asyncs",
"asyncs already unblocked", SCM_EOL);
- return (void *)scm_internal_dynamic_wind (decrease_block,
- (scm_t_inner) proc,
- increase_block,
- data,
- SCM_I_CURRENT_THREAD);
-}
-void
-scm_dynwind_block_asyncs ()
-{
- scm_i_thread *t = SCM_I_CURRENT_THREAD;
- scm_dynwind_rewind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY);
- scm_dynwind_unwind_handler (decrease_block, t, SCM_F_WIND_EXPLICITLY);
-}
+ scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
+ scm_dynwind_unblock_asyncs ();
+ ans = proc (data);
+ scm_dynwind_end ();
-void
-scm_dynwind_unblock_asyncs ()
-{
- scm_i_thread *t = SCM_I_CURRENT_THREAD;
- if (t->block_asyncs == 0)
- scm_misc_error ("scm_with_unblocked_asyncs",
- "asyncs already unblocked", SCM_EOL);
- scm_dynwind_rewind_handler (decrease_block, t, SCM_F_WIND_EXPLICITLY);
- scm_dynwind_unwind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY);
+ return ans;
}