merged pf_semaphore_signal() and pf_semaphore_signal_timed()
This commit is contained in:
parent
614e055cdb
commit
e026eaa581
108
moo/lib/exec.c
108
moo/lib/exec.c
@ -2824,61 +2824,6 @@ static moo_pfrc_t pf_process_suspend (moo_t* moo, moo_mod_t* mod, moo_ooi_t narg
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
static moo_pfrc_t pf_semaphore_signal (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
static moo_pfrc_t pf_semaphore_signal (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
||||||
{
|
|
||||||
moo_oop_t rcv;
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
|
||||||
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore));
|
|
||||||
|
|
||||||
/* signal_semaphore() may change the active process though the
|
|
||||||
* implementation as of this writing makes runnable the process waiting
|
|
||||||
* on the signal to be processed. it is safer to set the return value
|
|
||||||
* before calling signal_sempahore() */
|
|
||||||
MOO_STACK_SETRETTORCV (moo, nargs);
|
|
||||||
|
|
||||||
signal_semaphore (moo, (moo_oop_semaphore_t)rcv);
|
|
||||||
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_semaphore_wait (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
moo_oop_t rcv;
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
|
||||||
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore));
|
|
||||||
|
|
||||||
if (!can_await_semaphore(moo, (moo_oop_semaphore_t)rcv))
|
|
||||||
{
|
|
||||||
moo_seterrbfmt (moo, MOO_EPERM, "not allowed to wait on a semaphore that belongs to a semaphore group");
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* i must set the return value before calling await_semaphore().
|
|
||||||
* await_semaphore() may switch the active process and the stack
|
|
||||||
* manipulation macros target at the active process. i'm not supposed
|
|
||||||
* to change the return value of a new active process. */
|
|
||||||
MOO_STACK_SETRETTORCV (moo, nargs);
|
|
||||||
await_semaphore (moo, (moo_oop_semaphore_t)rcv);
|
|
||||||
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_semaphore_signal_on_gcfin (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
moo_oop_semaphore_t sem;
|
|
||||||
|
|
||||||
sem = (moo_oop_semaphore_t)MOO_STACK_GETRCV(moo, nargs);
|
|
||||||
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, (moo_oop_t)sem, moo->_semaphore));
|
|
||||||
|
|
||||||
/* TODO: should i prevent overwriting? */
|
|
||||||
moo->sem_gcfin = sem;
|
|
||||||
|
|
||||||
MOO_STACK_SETRETTORCV (moo, nargs); /* ^self */
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_semaphore_signal_timed (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
|
||||||
{
|
{
|
||||||
moo_oop_semaphore_t sem;
|
moo_oop_semaphore_t sem;
|
||||||
moo_oop_t sec, nsec;
|
moo_oop_t sec, nsec;
|
||||||
@ -2887,6 +2832,18 @@ static moo_pfrc_t pf_semaphore_signal_timed (moo_t* moo, moo_mod_t* mod, moo_ooi
|
|||||||
sem = (moo_oop_semaphore_t)MOO_STACK_GETRCV(moo, nargs);
|
sem = (moo_oop_semaphore_t)MOO_STACK_GETRCV(moo, nargs);
|
||||||
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, (moo_oop_t)sem, moo->_semaphore));
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, (moo_oop_t)sem, moo->_semaphore));
|
||||||
|
|
||||||
|
if (nargs <= 0)
|
||||||
|
{
|
||||||
|
/* signal_semaphore() may change the active process though the
|
||||||
|
* implementation as of this writing makes runnable the process waiting
|
||||||
|
* on the signal to be processed. it is safer to set the return value
|
||||||
|
* before calling signal_sempahore() */
|
||||||
|
MOO_STACK_SETRETTORCV (moo, nargs);
|
||||||
|
|
||||||
|
signal_semaphore (moo, sem);
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
sec = MOO_STACK_GETARG(moo, nargs, 0);
|
sec = MOO_STACK_GETARG(moo, nargs, 0);
|
||||||
nsec = (nargs == 2? MOO_STACK_GETARG(moo, nargs, 1): MOO_SMOOI_TO_OOP(0));
|
nsec = (nargs == 2? MOO_STACK_GETARG(moo, nargs, 1): MOO_SMOOI_TO_OOP(0));
|
||||||
|
|
||||||
@ -2964,6 +2921,20 @@ static moo_pfrc_t pf_semaphore_signal_timed (moo_t* moo, moo_mod_t* mod, moo_ooi
|
|||||||
return MOO_PF_SUCCESS;
|
return MOO_PF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_semaphore_signal_on_gcfin (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
moo_oop_semaphore_t sem;
|
||||||
|
|
||||||
|
sem = (moo_oop_semaphore_t)MOO_STACK_GETRCV(moo, nargs);
|
||||||
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, (moo_oop_t)sem, moo->_semaphore));
|
||||||
|
|
||||||
|
/* TODO: should i prevent overwriting? */
|
||||||
|
moo->sem_gcfin = sem;
|
||||||
|
|
||||||
|
MOO_STACK_SETRETTORCV (moo, nargs); /* ^self */
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static moo_pfrc_t __semaphore_signal_on_io (moo_t* moo, moo_ooi_t nargs, moo_semaphore_io_type_t io_type)
|
static moo_pfrc_t __semaphore_signal_on_io (moo_t* moo, moo_ooi_t nargs, moo_semaphore_io_type_t io_type)
|
||||||
{
|
{
|
||||||
moo_oop_semaphore_t sem;
|
moo_oop_semaphore_t sem;
|
||||||
@ -3022,6 +2993,29 @@ static moo_pfrc_t pf_semaphore_signal_on_output (moo_t* moo, moo_mod_t* mod, moo
|
|||||||
return __semaphore_signal_on_io(moo, nargs, MOO_SEMAPHORE_IO_TYPE_OUTPUT);
|
return __semaphore_signal_on_io(moo, nargs, MOO_SEMAPHORE_IO_TYPE_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_semaphore_wait (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
moo_oop_t rcv;
|
||||||
|
|
||||||
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
|
MOO_PF_CHECK_RCV (moo, moo_iskindof(moo, rcv, moo->_semaphore));
|
||||||
|
|
||||||
|
if (!can_await_semaphore(moo, (moo_oop_semaphore_t)rcv))
|
||||||
|
{
|
||||||
|
moo_seterrbfmt (moo, MOO_EPERM, "not allowed to wait on a semaphore that belongs to a semaphore group");
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* i must set the return value before calling await_semaphore().
|
||||||
|
* await_semaphore() may switch the active process and the stack
|
||||||
|
* manipulation macros target at the active process. i'm not supposed
|
||||||
|
* to change the return value of a new active process. */
|
||||||
|
MOO_STACK_SETRETTORCV (moo, nargs);
|
||||||
|
await_semaphore (moo, (moo_oop_semaphore_t)rcv);
|
||||||
|
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static moo_pfrc_t pf_semaphore_unsignal (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
static moo_pfrc_t pf_semaphore_unsignal (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
|
||||||
{
|
{
|
||||||
/* remove a semaphore from processor's signal scheduling.
|
/* remove a semaphore from processor's signal scheduling.
|
||||||
@ -4379,8 +4373,8 @@ static pf_t pftab[] =
|
|||||||
{ "SemaphoreGroup_wait", { pf_semaphore_group_wait, 0, 0 } },
|
{ "SemaphoreGroup_wait", { pf_semaphore_group_wait, 0, 0 } },
|
||||||
|
|
||||||
{ "Semaphore_signal", { pf_semaphore_signal, 0, 0 } },
|
{ "Semaphore_signal", { pf_semaphore_signal, 0, 0 } },
|
||||||
{ "Semaphore_signalAfterSecs:", { pf_semaphore_signal_timed, 1, 1 } },
|
{ "Semaphore_signalAfterSecs:", { pf_semaphore_signal, 1, 1 } },
|
||||||
{ "Semaphore_signalAfterSecs:nanosecs:", { pf_semaphore_signal_timed, 2, 2 } },
|
{ "Semaphore_signalAfterSecs:nanosecs:", { pf_semaphore_signal, 2, 2 } },
|
||||||
{ "Semaphore_signalOnGCFin", { pf_semaphore_signal_on_gcfin, 0, 0 } },
|
{ "Semaphore_signalOnGCFin", { pf_semaphore_signal_on_gcfin, 0, 0 } },
|
||||||
{ "Semaphore_signalOnInput:", { pf_semaphore_signal_on_input, 1, 1 } },
|
{ "Semaphore_signalOnInput:", { pf_semaphore_signal_on_input, 1, 1 } },
|
||||||
{ "Semaphore_signalOnOutput:", { pf_semaphore_signal_on_output, 1, 1 } },
|
{ "Semaphore_signalOnOutput:", { pf_semaphore_signal_on_output, 1, 1 } },
|
||||||
|
Loading…
Reference in New Issue
Block a user