X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/b4b8cd662b359e1f3dd44b3bea5a8ab02218b461..5ad960a6f99234c2085d0247aaf0c9343cae5be1:/ev.pod?ds=inline diff --git a/ev.pod b/ev.pod index 0bb2074..199eac0 100644 --- a/ev.pod +++ b/ev.pod @@ -858,7 +858,7 @@ Periodic watchers are also timers of a kind, but they are very versatile Unlike C's, they are not based on real time (or relative time) but on wallclock time (absolute time). You can tell a periodic watcher to trigger "at" some specific point in time. For example, if you tell a -periodic watcher to trigger in 10 seconds (by specifiying e.g. c) and then reset your system clock to the last year, then it will take a year to trigger the event (unlike an C, which would trigger roughly 10 seconds later and of course not if you reset your system time @@ -1312,7 +1312,380 @@ to use the libev header file and library. =head1 C++ SUPPORT -TBD. +Libev comes with some simplistic wrapper classes for C++ that mainly allow +you to use some convinience methods to start/stop watchers and also change +the callback model to a model using method callbacks on objects. + +To use it, + + #include + +(it is not installed by default). This automatically includes F +and puts all of its definitions (many of them macros) into the global +namespace. All C++ specific things are put into the C namespace. + +It should support all the same embedding options as F, most notably +C. + +Here is a list of things available in the C namespace: + +=over 4 + +=item C, C etc. + +These are just enum values with the same values as the C etc. +macros from F. + +=item C, C + +Aliases to the same types/functions as with the C prefix. + +=item C, C, C, C, C etc. + +For each C watcher in F there is a corresponding class of +the same name in the C namespace, with the exception of C +which is called C to avoid clashes with the C macro +defines by many implementations. + +All of those classes have these methods: + +=over 4 + +=item ev::TYPE::TYPE (object *, object::method *) + +=item ev::TYPE::TYPE (object *, object::method *, struct ev_loop *) + +=item ev::TYPE::~TYPE + +The constructor takes a pointer to an object and a method pointer to +the event handler callback to call in this class. The constructor calls +C for you, which means you have to call the C method +before starting it. If you do not specify a loop then the constructor +automatically associates the default loop with this watcher. + +The destructor automatically stops the watcher if it is active. + +=item w->set (struct ev_loop *) + +Associates a different C with this watcher. You can only +do this when the watcher is inactive (and not pending either). + +=item w->set ([args]) + +Basically the same as C, with the same args. Must be +called at least once. Unlike the C counterpart, an active watcher gets +automatically stopped and restarted. + +=item w->start () + +Starts the watcher. Note that there is no C argument as the +constructor already takes the loop. + +=item w->stop () + +Stops the watcher if it is active. Again, no C argument. + +=item w->again () C, C only + +For C and C, this invokes the corresponding +C function. + +=item w->sweep () C only + +Invokes C. + +=back + +=back + +Example: Define a class with an IO and idle watcher, start one of them in +the constructor. + + class myclass + { + ev_io io; void io_cb (ev::io &w, int revents); + ev_idle idle void idle_cb (ev::idle &w, int revents); + + myclass (); + } + + myclass::myclass (int fd) + : io (this, &myclass::io_cb), + idle (this, &myclass::idle_cb) + { + io.start (fd, ev::READ); + } + +=head1 EMBEDDING + +Libev can (and often is) directly embedded into host +applications. Examples of applications that embed it include the Deliantra +Game Server, the EV perl module, the GNU Virtual Private Ethernet (gvpe) +and rxvt-unicode. + +The goal is to enable you to just copy the neecssary files into your +source directory without having to change even a single line in them, so +you can easily upgrade by simply copying (or having a checked-out copy of +libev somewhere in your source tree). + +=head2 FILESETS + +Depending on what features you need you need to include one or more sets of files +in your app. + +=head3 CORE EVENT LOOP + +To include only the libev core (all the C functions), with manual +configuration (no autoconf): + + #define EV_STANDALONE 1 + #include "ev.c" + +This will automatically include F, too, and should be done in a +single C source file only to provide the function implementations. To use +it, do the same for F in all files wishing to use this API (best +done by writing a wrapper around F that you can include instead and +where you can put other configuration options): + + #define EV_STANDALONE 1 + #include "ev.h" + +Both header files and implementation files can be compiled with a C++ +compiler (at least, thats a stated goal, and breakage will be treated +as a bug). + +You need the following files in your source tree, or in a directory +in your include path (e.g. in libev/ when using -Ilibev): + + ev.h + ev.c + ev_vars.h + ev_wrap.h + + ev_win32.c required on win32 platforms only + + ev_select.c only when select backend is enabled (which is is by default) + ev_poll.c only when poll backend is enabled (disabled by default) + ev_epoll.c only when the epoll backend is enabled (disabled by default) + ev_kqueue.c only when the kqueue backend is enabled (disabled by default) + ev_port.c only when the solaris port backend is enabled (disabled by default) + +F includes the backend files directly when enabled, so you only need +to compile a single file. + +=head3 LIBEVENT COMPATIBILITY API + +To include the libevent compatibility API, also include: + + #include "event.c" + +in the file including F, and: + + #include "event.h" + +in the files that want to use the libevent API. This also includes F. + +You need the following additional files for this: + + event.h + event.c + +=head3 AUTOCONF SUPPORT + +Instead of using C and providing your config in +whatever way you want, you can also C in your +F and leave C off. F will then include +F and configure itself accordingly. + +For this of course you need the m4 file: + + libev.m4 + +=head2 PREPROCESSOR SYMBOLS/MACROS + +Libev can be configured via a variety of preprocessor symbols you have to define +before including any of its files. The default is not to build for multiplicity +and only include the select backend. + +=over 4 + +=item EV_STANDALONE + +Must always be C<1> if you do not use autoconf configuration, which +keeps libev from including F, and it also defines dummy +implementations for some libevent functions (such as logging, which is not +supported). It will also not define any of the structs usually found in +F that are not directly supported by the libev core alone. + +=item EV_USE_MONOTONIC + +If defined to be C<1>, libev will try to detect the availability of the +monotonic clock option at both compiletime 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, althoguh you have +to make sure you link against any libraries where the C +function is hiding in (often F<-lrt>). + +=item EV_USE_REALTIME + +If defined to be C<1>, libev will try to detect the availability of the +realtime clock option at compiletime (and assume its availability at +runtime if successful). Otherwise no use of the realtime clock option will +be attempted. This effectively replaces C by C and will not normally affect correctness. See tzhe note about libraries +in the description of C, though. + +=item EV_USE_SELECT + +If undefined or defined to be C<1>, libev will compile in support for the +C