1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-29 22:40:34 +02:00

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.
This commit is contained in:
Andy Wingo 2011-05-13 12:15:42 +02:00
parent 2e16a342f2
commit c98ce8f599

View file

@ -385,16 +385,37 @@ SCM_DEFINE (scm_mask_signals, "mask-signals", 0, 0, 0,
static void static void
increase_block (void *data) increase_block (void *data)
{ {
((scm_i_thread *)data)->block_asyncs++; scm_i_thread *t = data;
t->block_asyncs++;
} }
static void static void
decrease_block (void *data) 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 (); 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_DEFINE (scm_call_with_blocked_asyncs, "call-with-blocked-asyncs", 1, 0, 0,
(SCM proc), (SCM proc),
"Call @var{proc} with no arguments and block the execution\n" "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") "it is running. Return the value returned by @var{proc}.\n")
#define FUNC_NAME s_scm_call_with_blocked_asyncs #define FUNC_NAME s_scm_call_with_blocked_asyncs
{ {
return scm_internal_dynamic_wind (increase_block, SCM ans;
(scm_t_inner) scm_call_0,
decrease_block, scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
(void *)proc, scm_dynwind_block_asyncs ();
SCM_I_CURRENT_THREAD); ans = scm_call_0 (proc);
scm_dynwind_end ();
return ans;
} }
#undef FUNC_NAME #undef FUNC_NAME
void * void *
scm_c_call_with_blocked_asyncs (void *(*proc) (void *data), void *data) scm_c_call_with_blocked_asyncs (void *(*proc) (void *data), void *data)
{ {
return (void *)scm_internal_dynamic_wind (increase_block, void* ans;
(scm_t_inner) proc,
decrease_block, scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
data, scm_dynwind_block_asyncs ();
SCM_I_CURRENT_THREAD); 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") "it is running. Return the value returned by @var{proc}.\n")
#define FUNC_NAME s_scm_call_with_unblocked_asyncs #define FUNC_NAME s_scm_call_with_unblocked_asyncs
{ {
SCM ans;
if (SCM_I_CURRENT_THREAD->block_asyncs == 0) if (SCM_I_CURRENT_THREAD->block_asyncs == 0)
SCM_MISC_ERROR ("asyncs already unblocked", SCM_EOL); SCM_MISC_ERROR ("asyncs already unblocked", SCM_EOL);
return scm_internal_dynamic_wind (decrease_block,
(scm_t_inner) scm_call_0, scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
increase_block, scm_dynwind_unblock_asyncs ();
(void *)proc, ans = scm_call_0 (proc);
SCM_I_CURRENT_THREAD); scm_dynwind_end ();
return ans;
} }
#undef FUNC_NAME #undef FUNC_NAME
void * void *
scm_c_call_with_unblocked_asyncs (void *(*proc) (void *data), void *data) scm_c_call_with_unblocked_asyncs (void *(*proc) (void *data), void *data)
{ {
void* ans;
if (SCM_I_CURRENT_THREAD->block_asyncs == 0) if (SCM_I_CURRENT_THREAD->block_asyncs == 0)
scm_misc_error ("scm_c_call_with_unblocked_asyncs", scm_misc_error ("scm_c_call_with_unblocked_asyncs",
"asyncs already unblocked", SCM_EOL); "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_begin (SCM_F_DYNWIND_REWINDABLE);
scm_dynwind_block_asyncs () scm_dynwind_unblock_asyncs ();
{ ans = proc (data);
scm_i_thread *t = SCM_I_CURRENT_THREAD; scm_dynwind_end ();
scm_dynwind_rewind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY);
scm_dynwind_unwind_handler (decrease_block, t, SCM_F_WIND_EXPLICITLY);
}
void return ans;
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);
} }