*** empty log message ***

master
Marc Alexander Lehmann 2010-10-21 02:33:08 +00:00
parent f2bb26988c
commit 1976316308
5 changed files with 26 additions and 10 deletions

View File

@ -3,6 +3,7 @@ Revision history for libev, a high-performance and full-featured event loop.
TODO: ABI??? API????? Changes???
TODO: include ev_xyz_start in each example?
TODO: section watcher states/lifetime
TODO: ALL ev_xxx_set funtions must be called from ev++ set methods, somehow.
- "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading.
- ev_embed_stop did not correctly stop the watcher (very good
testcase by Vladimir Timofeev).
@ -14,6 +15,9 @@ TODO: section watcher states/lifetime
seems the former is *much* faster than the latter.
- reduce the number of spurious wake-ups with the ports backend.
- remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu).
- do async init within ev_async_start, not ev_async_set, which avoids
an API quirk where the set function must be called in the C++ API
even when there is nothing to set.
- add (undocumented) EV_ENABLE when adding events with kqueue,
this might help with OS X, which seems to need it despite documenting
not to need it (helpfully pointed out by Tilghman Lesher).

3
ev++.h
View File

@ -415,6 +415,7 @@ namespace ev {
#if EV_MULTIPLICITY
EV_PX;
// loop set
void set (EV_P) throw ()
{
this->EV_A = EV_A;
@ -783,8 +784,6 @@ namespace ev {
#if EV_ASYNC_ENABLE
EV_BEGIN_WATCHER (async, async)
void set () throw () { }
void send () throw ()
{
ev_async_send (EV_A_ static_cast<ev_async *>(this));

2
ev.c
View File

@ -3579,6 +3579,8 @@ ev_async_start (EV_P_ ev_async *w)
if (expect_false (ev_is_active (w)))
return;
w->sent = 0;
evpipe_init (EV_A);
EV_FREQUENT_CHECK;

2
ev.h
View File

@ -642,7 +642,7 @@ void ev_resume (EV_P);
#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */
#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0)
#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */
#define ev_async_set(ev) do { (ev)->sent = 0; } while (0)
#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */
#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)

25
ev.pod
View File

@ -3393,16 +3393,22 @@ do this when the watcher is inactive (and not pending either).
=item w->set ([arguments])
Basically the same as C<ev_TYPE_set>, with the same arguments. Must be
called at least once. Unlike the C counterpart, an active watcher gets
automatically stopped and restarted when reconfiguring it with this
method.
Basically the same as C<ev_TYPE_set>, with the same arguments. Either this
method or a suitable start method must be called at least once. Unlike the
C counterpart, an active watcher gets automatically stopped and restarted
when reconfiguring it with this method.
=item w->start ()
Starts the watcher. Note that there is no C<loop> argument, as the
constructor already stores the event loop.
=item w->start ([arguments])
Instead of calling C<set> and C<start> methods separately, it is often
convenient to wrap them in one call. Uses the same type of arguments as
the configure C<set> method of the watcher.
=item w->stop ()
Stops the watcher if it is active. Again, no C<loop> argument.
@ -3424,20 +3430,25 @@ Invokes C<ev_stat_stat>.
=back
Example: Define a class with an IO and idle watcher, start one of them in
the constructor.
Example: Define a class with two I/O and idle watchers, start the I/O
watchers in the constructor.
class myclass
{
ev::io io ; void io_cb (ev::io &w, int revents);
ev::io2 io2 ; void io2_cb (ev::io &w, int revents);
ev::idle idle; void idle_cb (ev::idle &w, int revents);
myclass (int fd)
{
io .set <myclass, &myclass::io_cb > (this);
io2 .set <myclass, &myclass::io2_cb > (this);
idle.set <myclass, &myclass::idle_cb> (this);
io.start (fd, ev::READ);
io.set (fd, ev::WRITE); // configure the watcher
io.start (); // start it whenever convenient
io2.start (fd, ev::READ); // set + start in one call
}
};