… | |
… | |
1496 | semantics of C<ev_stat> watchers, which means that libev sometimes needs |
1496 | semantics of C<ev_stat> watchers, which means that libev sometimes needs |
1497 | to fall back to regular polling again even with inotify, but changes are |
1497 | to fall back to regular polling again even with inotify, but changes are |
1498 | usually detected immediately, and if the file exists there will be no |
1498 | usually detected immediately, and if the file exists there will be no |
1499 | polling. |
1499 | polling. |
1500 | |
1500 | |
|
|
1501 | =head3 The special problem of stat time resolution |
|
|
1502 | |
|
|
1503 | The C<stat ()> syscall only supports full-second resolution portably, and |
|
|
1504 | even on systems where the resolution is higher, many filesystems still |
|
|
1505 | only support whole seconds. |
|
|
1506 | |
|
|
1507 | That means that, if the time is the only thing that changes, you might |
|
|
1508 | miss updates: on the first update, C<ev_stat> detects a change and calls |
|
|
1509 | your callback, which does something. When there is another update within |
|
|
1510 | the same second, C<ev_stat> will be unable to detect it. |
|
|
1511 | |
|
|
1512 | The solution to this is to delay acting on a change for a second (or till |
|
|
1513 | the 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> |
|
|
1515 | is added to work around small timing inconsistencies of some operating |
|
|
1516 | systems. |
|
|
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 | |
|
|
1589 | Example: Like above, but additionally use a one-second delay so we do not |
|
|
1590 | miss updates (however, frequent updates will delay processing, too, so |
|
|
1591 | one might do the work both on C<ev_stat> callback invocation I<and> on |
|
|
1592 | C<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 | |
1575 | Idle watchers trigger events when no other events of the same or higher |
1620 | Idle watchers trigger events when no other events of the same or higher |