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:
parent
2e16a342f2
commit
c98ce8f599
1 changed files with 55 additions and 39 deletions
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue