I have a need for a type of watcher for which events are only generated
manually.  I want this for event types along the lines of "redraw
required": it's generated as a result of internal program logic, but
I want it to be subject to priority queuing.  I'm surprised that there
isn't already a "non-specific" watcher class, one that never automatically
generates an event.  However, the "now" method is there, and I think I
can roll my own.

The first thing I've tried is a stopped watcher:

        #!/usr/bin/perl

        use warnings;
        use strict;

        use Event;

        my $my_watcher = Event->var(parked => 1, cb => sub {
                print "my_watcher event\n";
        });

        Event->io(fd => \*STDIN, cb => sub {
                scalar <STDIN>;
                print "got input\n";
                $my_watcher->now;
        });

        Event::loop();

This works as I expected.  The my_watcher events are generated by the
STDIN handler, and the my_watcher handler gets called.

(Digression: a bug report:

Note that "now" works perfectly well on a stopped watcher.  There's a
related bug: if the stopped event has no callback set, then a SEGV
results.  Try that out by changing the setup of $my_watcher above to

        my $my_watcher = Event->var(parked => 1);

I'm not sure what the semantics of "now" on a stopped watcher ought to be.
The two obvious candidates are: (a) act as now, but balk if no callback
is set; (b) silently do nothing if the watcher is stopped.  Option (b)
would be convenient for the usage I discuss below, but I don't know how
"now" is being used by other people.  Maybe both versions are useful.

End digression.)

There's a problem with the stopped-watcher approach: I want to obey
normal watcher semantics, namely to not generate events if the watcher
is stopped.  I want the recipient of these events to be able to use the
watcher's "active" flag to control whether it receives events.  This means
I need an *active* watcher that never automatically generates events.
I might have lots of these active at once, for different types of event,
so it's important that their overhead be minimal when they're quiescent.
What's the lowest-overhead watcher that will never generate an event
while active?

-zefram

Reply via email to