Re: alarm() and later()

2005-04-21 Thread Brent 'Dax' Royal-Gordon
Larry Wall [EMAIL PROTECTED] wrote:
 Assuming we
 rehuffmanize kill to sendsignal or some such, we have:

signal is a verb as well as a noun.

sub alarm ($secs) {
   { signal $*PID, Signal::ALARM }.cue(:delay($secs));
   }

It even reads pretty nicely: signal 4242.

-- 
Brent 'Dax' Royal-Gordon [EMAIL PROTECTED]
Perl and Parrot hacker

I used to have a life, but I liked mail-reading so much better.


Re: alarm() and later()

2005-04-21 Thread Larry Wall
On Thu, Apr 21, 2005 at 01:51:36PM -0700, Brent 'Dax' Royal-Gordon wrote:
: Larry Wall [EMAIL PROTECTED] wrote:
:  Assuming we
:  rehuffmanize kill to sendsignal or some such, we have:
: 
: signal is a verb as well as a noun.
: 
: sub alarm ($secs) {
:{ signal $*PID, Signal::ALARM }.cue(:delay($secs));
:}
: 
: It even reads pretty nicely: signal 4242.

The cultural problem is that C's ancient signal() sets a signal
handler rather than sending a signal.  I figured as long as we were
trying to discourage the use of signals we might as well make it
something even longer, but clearer.

Larry


Re: alarm() and later()

2005-04-20 Thread Leopold Toetsch
Gaal Yahas [EMAIL PROTECTED] wrote:
 Two things popped up while implementing a demo version of alarm() today.

 1. In perl5 and in most underlying libraries, alarm() has 1 second
 granularity

 2. ..., in which you can
 pass an optional closure to alarm()

I can't say anything about the actual Perl6 syntax, but Parrot provides
sub-second resolution as well as alarm callbacks and of course multiple
timers.

leo


Re: alarm() and later()

2005-04-20 Thread Larry Wall
On Wed, Apr 20, 2005 at 08:20:04AM +0200, Leopold Toetsch wrote:
: I can't say anything about the actual Perl6 syntax, but Parrot provides
: sub-second resolution as well as alarm callbacks and of course multiple
: timers.

We will certainly be pushing all the time interfaces of Perl 6 toward
using floating-point time values.  The only question is whether alarm()
is the right name for one of the interfaces, and whether we even need an
interface whose *default* behavior is to send a signal, ugh.  We should
probably be encouraging timed callbacks instead.  We could even force
people to define their own alarm if they want one.  Assuming we
rehuffmanize kill to sendsignal or some such, we have:

sub alarm ($secs) {
{ sendsignal $*PID, Signal::ALARM }.cue(:delay($secs));
}

Though I suppose people really mostly just want something like

sub alarm ($secs) {
{ sendsignal $*PID, Signal::ALARM }.delay($secs);
}

The actual verb/adverb names are negotiable, but they need to handle
relative vs absolute times intuitively.  Different words have different
connotations in that regard.  delay is definitely relative, while
after tends toward absolute, though can be used relatively too.
at is definitely absolute time, but maybe too overloaded with
positional meanings.  later is unfortunately completely ambiguous.

By the way, I was tempted to make it sendsig, but then I started
wondering what it would mean to send a sigil or a signature...

In any event (no pun intended), I've always wondered how it is you 
can kill a process with a SIGCONT.  As long as we're fixing everything
else, maybe we can fix Unix too.  :-)

Larry


Re: alarm() and later()

2005-04-20 Thread Gaal Yahas
On Wed, Apr 20, 2005 at 10:11:35AM -0700, Larry Wall wrote:
 We will certainly be pushing all the time interfaces of Perl 6 toward
 using floating-point time values.  The only question is whether alarm()
 is the right name for one of the interfaces, and whether we even need an
 interface whose *default* behavior is to send a signal, ugh.  We should
 probably be encouraging timed callbacks instead.  We could even force
 people to define their own alarm if they want one.  Assuming we
 rehuffmanize kill to sendsignal or some such, we have:
 
(FWIW, this is called signalProcess in Haskell.)

 sub alarm ($secs) {
   { sendsignal $*PID, Signal::ALARM }.cue(:delay($secs));
 }
 
 Though I suppose people really mostly just want something like
 
 sub alarm ($secs) {
   { sendsignal $*PID, Signal::ALARM }.delay($secs);
 }
 
 The actual verb/adverb names are negotiable, but they need to handle
 relative vs absolute times intuitively.  Different words have different
 connotations in that regard.  delay is definitely relative, while
 after tends toward absolute, though can be used relatively too.
 at is definitely absolute time, but maybe too overloaded with
 positional meanings.  later is unfortunately completely ambiguous.

We also want repeat events; I can think of two ways to do it. Either
require everything to be explicit with adverbs, or have the closure's
return value determine whether to keep calling back or to quit. GLib
does the latter, and there's a cleanliness in how the closure itself can
control when to stop, but the former means you can schedule arbitrary
code without changing it.

Is there anybody from the perl-loop gang around here? I'm sure they've
thought about these things a lot.

-- 
Gaal Yahas [EMAIL PROTECTED]
http://gaal.livejournal.com/


Re: alarm() and later()

2005-04-20 Thread Larry Wall
On Wed, Apr 20, 2005 at 09:29:17PM +0300, Gaal Yahas wrote:
: (FWIW, this is called signalProcess in Haskell.)

Also in the FWIW department, I mislike mixed-case identifiers for
anything in the core.  That sort of things screams user-defined
to me.

To a lesser extent, I also tend to avoid underscores in the core
unless I'm trying to be obnoxious: DONT_EVER_USE_THIS_FEATURE(1).

: We also want repeat events; I can think of two ways to do it. Either
: require everything to be explicit with adverbs, or have the closure's
: return value determine whether to keep calling back or to quit. GLib
: does the latter, and there's a cleanliness in how the closure itself can
: control when to stop, but the former means you can schedule arbitrary
: code without changing it.

I think the conceptual default for callbacks should be single call,
with the return value reserved for returning actual data to whatever
context calls it.  It's easy enough to have a special call that says
something like call_me_again().  Er, callmeagain()...  :-)

You also have the ability to schedule repeated calls externally to the
closure, presumably.  In general, I think that's even cleaner than
usurping the return value.  I'm presuming we also give the closure
some way to get at its scheduler handle so it can remove itself from
repeats, or otherwise give it some kind of dont_call_me_again().  Er...

All that being said, it doesn't actually make a lot of sense to return
user data to the scheduler.  Unless, that is, the scheduler is also
managing some kind of pipeline and will feed that return value to
some other code.  But then, timed generators are nice for lots of
simulation applications.  (But then you start getting into discrete
event simulations where you want to simulate the flow of time as well,
where delay() isn't really a real delay, but just waits till virtual
time gets far enough.  Well, that's enough brain strain for now.)

Larry


Re: alarm() and later()

2005-04-20 Thread Uri Guttman
 GY == Gaal Yahas [EMAIL PROTECTED] writes:

   sub alarm ($secs) {
   { sendsignal $*PID, Signal::ALARM }.cue(:delay($secs));
   }
   
   Though I suppose people really mostly just want something like
   
   sub alarm ($secs) {
   { sendsignal $*PID, Signal::ALARM }.delay($secs);
   }
   
   The actual verb/adverb names are negotiable, but they need to handle
   relative vs absolute times intuitively.  Different words have different
   connotations in that regard.  delay is definitely relative, while
   after tends toward absolute, though can be used relatively too.
   at is definitely absolute time, but maybe too overloaded with
   positional meanings.  later is unfortunately completely ambiguous.

  GY We also want repeat events; I can think of two ways to do it. Either
  GY require everything to be explicit with adverbs, or have the closure's
  GY return value determine whether to keep calling back or to quit. GLib
  GY does the latter, and there's a cleanliness in how the closure itself can
  GY control when to stop, but the former means you can schedule arbitrary
  GY code without changing it.

  GY Is there anybody from the perl-loop gang around here? I'm sure they've
  GY thought about these things a lot.

i do a fair amount of event loop stuff in perl and have worked on
various apis for it. i have a few rfc's which try to tie in timers and
signals and async io with perl6's i/o functions (none of which are
defined yet).

the good news is that parrot will be providing a clean core event loop
mechanism using native kernel threads and event queues.

what a proper event loop program needs is an event loop run core or
module. it would block on reading the event queue and dispatch events
(via callbacks) as they get read in.

also you need to let go of flow control to an event loop. otherwise you
will be running 100% cpu until you block hard and the event loop can't
run again. the problem is that if you use callbacks and no threads, you
must have an event loop take over. parrot will not offer this directly
but it will be easy to create one on top of the event queue it
provides. 

most uses of simple alarms now are sleep timers and breaking out of
blocking calls with die. anything more complex (even 2 timers at one
time) need a proper event loop and proper control over creating and
handling them.

signal handling can be a subset of the event loop (which is good, as
that means they can get delivered synchronously and not be a worry like
they used to be in p5 without event loops).

so the biggest difference with larry's api is that you need to specify a
callback (method or code ref or either?) in the call that sets up a
timer. and you need several options so it should be a key/value api with
good defaults. here are some of the useful options (see Event.pm for
where this is mostly from).

the problem with signal alarm is that it doesn't have any way to handle
the extra options without major pain.


callbackcode ref, closure, method (and object in diff
arg) or Signal::ALARM.
this could have a default like ::timer_handler

delay   MINIMUM delay before timer gets triggered

at  absolute time. converted internally to delay

intervalrepeat interval. if this is set and delay isn't,
the first delay will be this interval. this gets
you a simple repeating trigger.

hardthis is useful boolean but can be tricky to explain. a
hard timer doesn't count the time used in the
callback. its intervals are hard (i.e. always 5
seconds). a soft timer counts the interval from
when the callback returns. so it is 5 seconds
plus callback time as the interval.

object  callback to this object (forces the callback to
be method name).

Event.pm has a single callback arg, either a sub name or code ref or a
anon array with a method and object.

so the api could be as simple as this (p5ish style):

sub timer_handler {

say 'my time has come!'
}

set_timer_handler( interval = 5.0 ) ;

main_event_loop() ;

note the use of the default callback sub name.

a more complex one:


method timer_method {

say 'my time has come!'
}

set_timer_handler( callback = timer_method, object = $obj, interval = 5.0 ) ;

main_event_loop() ;


also the set_timer func returns a handle to manage the timer. then you
can reset it (reset the timer to 0 for this interval. useful for i/o
activity monitoring), disable/enable it and shut it down. so i would say
the returned thing should be an event object with those (and other)
methods. this implies a core Event class to handle this common stuff.

and integrating with other event loops (GUI ones in particular) is
handled by creating Event::EventLoopofChoice wrapper 

alarm() and later()

2005-04-18 Thread Gaal Yahas
Two things popped up while implementing a demo version of alarm() today.

1. In perl5 and in most underlying libraries, alarm() has 1 second
granularity (and a possible 1 second error on top of that). Can we have
the alarm builtin not assume the worst, and take a Num instead of an
Int, so that on some systems at least we get higher resolution sleeps?

2. Since signals are so global and sometimes we want something else,
how about a variation on the traditional u?alarm theme, in which you can
pass an optional closure to alarm() that will get called back instead of
having a SIGALRM raised?

 multi sub alarm(: Num ?$timeout = $CALLER::_,
   Num ?$interval,
   Code ?$callback) returns Int

This should be reentrant and allow multiple uses. The Int return is an
id on the future event so you can cancel it. (Which needs speccing.
Possibly this could return a reference to some object instead of an
id?) If the alarm builtin is getting too overloaded, I propose the
closure version be named later.


-- 
Gaal Yahas [EMAIL PROTECTED]
http://gaal.livejournal.com/