--- libev/ev.pod 2008/10/30 08:09:30 1.210 +++ libev/ev.pod 2008/11/20 00:35:10 1.218 @@ -11,6 +11,8 @@ // a single header file is required #include + #include // for puts + // every watcher type has its own typedef'd struct // with the name ev_TYPE ev_io stdin_watcher; @@ -420,6 +422,10 @@ as in libev having to destroy and recreate the epoll object, which can take considerable time and thus should be avoided. +All this means that, in practice, C can be as fast or +faster than epoll for maybe up to a hundred file descriptors, depending on +the usage. So sad. + While nominally embeddable in other event loops, this feature is broken in all kernel versions tested so far. @@ -1417,7 +1423,7 @@ // callback was invoked, but there was some activity, re-arm // the watcher to fire in last_activity + 60, which is // guaranteed to be in the future, so "again" is positive: - w->again = timeout - now; + w->repeat = timeout - now; ev_timer_again (EV_A_ w); } } @@ -1934,10 +1940,11 @@ it did. The path does not need to exist: changing from "path exists" to "path does -not exist" is a status change like any other. The condition "path does -not exist" is signified by the C field being zero (which is -otherwise always forced to be at least one) and all the other fields of -the stat buffer having unspecified contents. +not exist" is a status change like any other. The condition "path does not +exist" (or more correctly "path cannot be stat'ed") is signified by the +C field being zero (which is otherwise always forced to be at +least one) and all the other fields of the stat buffer having unspecified +contents. The path I end in a slash or contain special components such as C<.> or C<..>. The path I be absolute: If it is relative and @@ -1957,9 +1964,9 @@ resource-intensive. At the time of this writing, the only OS-specific interface implemented -is the Linux inotify interface (implementing kqueue support is left as -an exercise for the reader. Note, however, that the author sees no way -of implementing C semantics with kqueue). +is the Linux inotify interface (implementing kqueue support is left as an +exercise for the reader. Note, however, that the author sees no way of +implementing C semantics with kqueue, except as a hint). =head3 ABI Issues (Largefile Support) @@ -1980,23 +1987,43 @@ =head3 Inotify and Kqueue -When C support has been compiled into libev (generally -only available with Linux 2.6.25 or above due to bugs in earlier -implementations) and present at runtime, it will be used to speed up -change detection where possible. The inotify descriptor will be created -lazily when the first C watcher is being started. +When C support has been compiled into libev and present at +runtime, it will be used to speed up change detection where possible. The +inotify descriptor will be created lazily when the first C +watcher is being started. Inotify presence does not change the semantics of C watchers except that changes might be detected earlier, and in some cases, to avoid making regular C calls. Even in the presence of inotify support there are many cases where libev has to resort to regular C polling, -but as long as the path exists, libev usually gets away without polling. +but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too +many bugs), the path exists (i.e. stat succeeds), and the path resides on +a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and +xfs are fully working) libev usually gets away without polling. There is no support for kqueue, as apparently it cannot be used to implement this functionality, due to the requirement of having a file descriptor open on the object at all times, and detecting renames, unlinks etc. is difficult. +=head3 C is a synchronous operation + +Libev doesn't normally do any kind of I/O itself, and so is not blocking +the process. The exception are C watchers - those call C, which is a synchronous operation. + +For local paths, this usually doesn't matter: unless the system is very +busy or the intervals between stat's are large, a stat call will be fast, +as the path data is suually in memory already (except when starting the +watcher). + +For networked file systems, calling C can block an indefinite +time due to network issues, and even under good conditions, a stat call +often takes multiple milliseconds. + +Therefore, it is best to avoid using C watchers on networked +paths, although this is fully supported by libev. + =head3 The special problem of stat time resolution The C system call only supports full-second resolution portably, @@ -2974,6 +3001,9 @@ more on top of it. It can be found via gem servers. Its homepage is at L. +Roger Pack reports that using the link order C<-lws2_32 -lmsvcrt-ruby-190> +makes rev work even on mingw. + =item D Leandro Lucarella has written a D language binding (F) for libev, to @@ -3159,15 +3189,18 @@ supported). It will also not define any of the structs usually found in F that are not directly supported by the libev core alone. +In stanbdalone mode, libev will still try to automatically deduce the +configuration, but has to be more conservative. + =item EV_USE_MONOTONIC If defined to be C<1>, libev will try to detect the availability of the -monotonic clock option at both compile time and runtime. Otherwise no use -of the monotonic clock option will be attempted. If you enable this, you -usually have to link against librt or something similar. Enabling it when -the functionality isn't available is safe, though, although you have +monotonic clock option at both compile time and runtime. Otherwise no +use of the monotonic clock option will be attempted. If you enable this, +you usually have to link against librt or something similar. Enabling it +when the functionality isn't available is safe, though, although you have to make sure you link against any libraries where the C -function is hiding in (often F<-lrt>). +function is hiding in (often F<-lrt>). See also C. =item EV_USE_REALTIME @@ -3178,6 +3211,16 @@ (CLOCK_REALTIME, ...)> and will not normally affect correctness. See the note about libraries in the description of C, though. +=item EV_USE_CLOCK_SYSCALL + +If defined to be C<1>, libev will try to use a direct syscall instead +of calling the system-provided C function. This option +exists because on GNU/Linux, C is in C, but C +unconditionally pulls in C, slowing down single-threaded +programs needlessly. Using a direct syscall is slightly slower, because +no optimised vdso implementation can be used, but avoids the pthread +dependency. Defaults to C<1> on GNU/Linux with glibc 2.x or higher. + =item EV_USE_NANOSLEEP If defined to be C<1>, libev will assume that C is available @@ -3202,11 +3245,11 @@ If defined to C<1>, then the select backend will use the system C structure. This is useful if libev doesn't compile due to a missing -C or C definition or it mis-guesses the bitset layout on -exotic systems. This usually limits the range of file descriptors to some -low limit such as 1024 or might have other limitations (winsocket only -allows 64 sockets). The C macro, set before compilation, might -influence the size of the C used. +C or C definition or it mis-guesses the bitset layout +on exotic systems. This usually limits the range of file descriptors to +some low limit such as 1024 or might have other limitations (winsocket +only allows 64 sockets). The C macro, set before compilation, +configures the maximum size of the C. =item EV_SELECT_IS_WINSOCKET