ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.pod
(Generate patch)

Comparing libev/ev.pod (file contents):
Revision 1.106 by root, Sun Dec 23 03:57:55 2007 UTC vs.
Revision 1.107 by root, Mon Dec 24 04:34:00 2007 UTC

1496semantics of C<ev_stat> watchers, which means that libev sometimes needs 1496semantics of C<ev_stat> watchers, which means that libev sometimes needs
1497to fall back to regular polling again even with inotify, but changes are 1497to fall back to regular polling again even with inotify, but changes are
1498usually detected immediately, and if the file exists there will be no 1498usually detected immediately, and if the file exists there will be no
1499polling. 1499polling.
1500 1500
1501=head3 The special problem of stat time resolution
1502
1503The C<stat ()> syscall only supports full-second resolution portably, and
1504even on systems where the resolution is higher, many filesystems still
1505only support whole seconds.
1506
1507That means that, if the time is the only thing that changes, you might
1508miss updates: on the first update, C<ev_stat> detects a change and calls
1509your callback, which does something. When there is another update within
1510the same second, C<ev_stat> will be unable to detect it.
1511
1512The solution to this is to delay acting on a change for a second (or till
1513the next second boundary), using a roughly one-second delay C<ev_timer>
1514(C<ev_timer_set (w, 0., 1.01); ev_timer_again (loop, w)>). The C<.01>
1515is added to work around small timing inconsistencies of some operating
1516systems.
1517
1501=head3 Watcher-Specific Functions and Data Members 1518=head3 Watcher-Specific Functions and Data Members
1502 1519
1503=over 4 1520=over 4
1504 1521
1505=item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval) 1522=item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)
1564 } 1581 }
1565 1582
1566 ... 1583 ...
1567 ev_stat passwd; 1584 ev_stat passwd;
1568 1585
1569 ev_stat_init (&passwd, passwd_cb, "/etc/passwd"); 1586 ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.);
1570 ev_stat_start (loop, &passwd); 1587 ev_stat_start (loop, &passwd);
1588
1589Example: Like above, but additionally use a one-second delay so we do not
1590miss updates (however, frequent updates will delay processing, too, so
1591one might do the work both on C<ev_stat> callback invocation I<and> on
1592C<ev_timer> callback invocation).
1593
1594 static ev_stat passwd;
1595 static ev_timer timer;
1596
1597 static void
1598 timer_cb (EV_P_ ev_timer *w, int revents)
1599 {
1600 ev_timer_stop (EV_A_ w);
1601
1602 /* now it's one second after the most recent passwd change */
1603 }
1604
1605 static void
1606 stat_cb (EV_P_ ev_stat *w, int revents)
1607 {
1608 /* reset the one-second timer */
1609 ev_timer_again (EV_A_ &timer);
1610 }
1611
1612 ...
1613 ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.);
1614 ev_stat_start (loop, &passwd);
1615 ev_timer_init (&timer, timer_cb, 0., 1.01);
1571 1616
1572 1617
1573=head2 C<ev_idle> - when you've got nothing better to do... 1618=head2 C<ev_idle> - when you've got nothing better to do...
1574 1619
1575Idle watchers trigger events when no other events of the same or higher 1620Idle watchers trigger events when no other events of the same or higher

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines