diff options
author | root <root> | 2007-11-27 20:38:07 +0000 |
---|---|---|
committer | root <root> | 2007-11-27 20:38:07 +0000 |
commit | d62943221d916737d52e83db662e6a1e2f92db0a (patch) | |
tree | c58823176c724bd60c0aff8583768564cb0ea69d | |
parent | e0d2a4b0f08314f5c9f39199ee91f045c2f98d4b (diff) |
*** empty log message ***
-rw-r--r-- | ev.3 | 45 | ||||
-rw-r--r-- | ev.html | 72 | ||||
-rw-r--r-- | ev.pod | 35 |
3 files changed, 123 insertions, 29 deletions
@@ -858,8 +858,8 @@ events but its callback has not yet been invoked). As long as a watcher is pending (but not active) you must not call an init function on it (but \&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe) and you must make sure the watcher is available to libev (e.g. you cnanot \f(CW\*(C`free ()\*(C'\fR it). -.IP "callback = ev_cb (ev_TYPE *watcher)" 4 -.IX Item "callback = ev_cb (ev_TYPE *watcher)" +.IP "callback ev_cb (ev_TYPE *watcher)" 4 +.IX Item "callback ev_cb (ev_TYPE *watcher)" Returns the callback currently set on the watcher. .IP "ev_cb_set (ev_TYPE *watcher, callback)" 4 .IX Item "ev_cb_set (ev_TYPE *watcher, callback)" @@ -895,8 +895,45 @@ can cast it back to your own type: \& } .Ve .PP -More interesting and less C\-conformant ways of catsing your callback type -have been omitted.... +More interesting and less C\-conformant ways of casting your callback type +instead have been omitted. +.PP +Another common scenario is having some data structure with multiple +watchers: +.PP +.Vb 6 +\& struct my_biggy +\& { +\& int some_data; +\& ev_timer t1; +\& ev_timer t2; +\& } +.Ve +.PP +In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more complicated, +you need to use \f(CW\*(C`offsetof\*(C'\fR: +.PP +.Vb 1 +\& #include <stddef.h> +.Ve +.PP +.Vb 6 +\& static void +\& t1_cb (EV_P_ struct ev_timer *w, int revents) +\& { +\& struct my_biggy big = (struct my_biggy * +\& (((char *)w) - offsetof (struct my_biggy, t1)); +\& } +.Ve +.PP +.Vb 6 +\& static void +\& t2_cb (EV_P_ struct ev_timer *w, int revents) +\& { +\& struct my_biggy big = (struct my_biggy * +\& (((char *)w) - offsetof (struct my_biggy, t2)); +\& } +.Ve .SH "WATCHER TYPES" .IX Header "WATCHER TYPES" This section describes each watcher in detail, but will not repeat @@ -6,7 +6,7 @@ <meta name="description" content="Pod documentation for libev" /> <meta name="inputfile" content="<standard input>" /> <meta name="outputfile" content="<standard output>" /> - <meta name="created" content="Tue Nov 27 21:26:46 2007" /> + <meta name="created" content="Tue Nov 27 21:38:05 2007" /> <meta name="generator" content="Pod::Xhtml 1.57" /> <link rel="stylesheet" href="http://res.tst.eu/pod.css"/></head> <body> @@ -62,19 +62,19 @@ </ul><hr /> <!-- INDEX END --> -<h1 id="NAME">NAME</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="NAME">NAME</h1> <div id="NAME_CONTENT"> <p>libev - a high performance full-featured event loop written in C</p> </div> -<h1 id="SYNOPSIS">SYNOPSIS</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="SYNOPSIS">SYNOPSIS</h1> <div id="SYNOPSIS_CONTENT"> <pre> #include <ev.h> </pre> </div> -<h1 id="EXAMPLE_PROGRAM">EXAMPLE PROGRAM</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="EXAMPLE_PROGRAM">EXAMPLE PROGRAM</h1> <div id="EXAMPLE_PROGRAM_CONTENT"> <pre> #include <ev.h> @@ -119,7 +119,7 @@ </pre> </div> -<h1 id="DESCRIPTION">DESCRIPTION</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="DESCRIPTION">DESCRIPTION</h1> <div id="DESCRIPTION_CONTENT"> <p>Libev is an event loop: you register interest in certain events (such as a file descriptor being readable or a timeout occuring), and it will manage @@ -133,7 +133,7 @@ details of the event, and then hand it over to libev by <i>starting</i> the watcher.</p> </div> -<h1 id="FEATURES">FEATURES</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="FEATURES">FEATURES</h1> <div id="FEATURES_CONTENT"> <p>Libev supports <code>select</code>, <code>poll</code>, the linux-specific <code>epoll</code>, the bsd-specific <code>kqueue</code> and the solaris-specific event port mechanisms @@ -149,7 +149,7 @@ file watchers (<code>ev_stat</code>) and even limited support for fork events for example).</p> </div> -<h1 id="CONVENTIONS">CONVENTIONS</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="CONVENTIONS">CONVENTIONS</h1> <div id="CONVENTIONS_CONTENT"> <p>Libev is very configurable. In this manual the default configuration will be described, which supports multiple event loops. For more info about @@ -159,7 +159,7 @@ loops, then all functions taking an initial argument of name <code>loop</code> (which is always of type <code>struct ev_loop *</code>) will not have this argument.</p> </div> -<h1 id="TIME_REPRESENTATION">TIME REPRESENTATION</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="TIME_REPRESENTATION">TIME REPRESENTATION</h1> <div id="TIME_REPRESENTATION_CONTENT"> <p>Libev represents time as a single floating point number, representing the (fractional) number of seconds since the (POSIX) epoch (somewhere near @@ -169,7 +169,7 @@ to the <code>double</code> type in C, and when you need to do any calculations o it, you should treat it as such.</p> </div> -<h1 id="GLOBAL_FUNCTIONS">GLOBAL FUNCTIONS</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="GLOBAL_FUNCTIONS">GLOBAL FUNCTIONS</h1> <div id="GLOBAL_FUNCTIONS_CONTENT"> <p>These functions can be called anytime, even before initialising the library in any way.</p> @@ -287,7 +287,7 @@ requested operation, or, if the condition doesn't go away, do bad stuff </dl> </div> -<h1 id="FUNCTIONS_CONTROLLING_THE_EVENT_LOOP">FUNCTIONS CONTROLLING THE EVENT LOOP</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="FUNCTIONS_CONTROLLING_THE_EVENT_LOOP">FUNCTIONS CONTROLLING THE EVENT LOOP</h1> <div id="FUNCTIONS_CONTROLLING_THE_EVENT_LOOP-2"> <p>An event loop is described by a <code>struct ev_loop *</code>. The library knows two types of such loops, the <i>default</i> loop, which supports signals and child @@ -570,7 +570,7 @@ running when nothing else is active.</p> </div> -<h1 id="ANATOMY_OF_A_WATCHER">ANATOMY OF A WATCHER</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="ANATOMY_OF_A_WATCHER">ANATOMY OF A WATCHER</h1> <div id="ANATOMY_OF_A_WATCHER_CONTENT"> <p>A watcher is a structure that you create and register to record your interest in some event. For instance, if you want to wait for STDIN to @@ -743,7 +743,7 @@ is pending (but not active) you must not call an init function on it (but <code>ev_TYPE_set</code> is safe) and you must make sure the watcher is available to libev (e.g. you cnanot <code>free ()</code> it).</p> </dd> - <dt>callback = ev_cb (ev_TYPE *watcher)</dt> + <dt>callback ev_cb (ev_TYPE *watcher)</dt> <dd> <p>Returns the callback currently set on the watcher.</p> </dd> @@ -785,15 +785,43 @@ can cast it back to your own type:</p> } </pre> -<p>More interesting and less C-conformant ways of catsing your callback type -have been omitted....</p> +<p>More interesting and less C-conformant ways of casting your callback type +instead have been omitted.</p> +<p>Another common scenario is having some data structure with multiple +watchers:</p> +<pre> struct my_biggy + { + int some_data; + ev_timer t1; + ev_timer t2; + } +</pre> +<p>In this case getting the pointer to <code>my_biggy</code> is a bit more complicated, +you need to use <code>offsetof</code>:</p> +<pre> #include <stddef.h> + static void + t1_cb (EV_P_ struct ev_timer *w, int revents) + { + struct my_biggy big = (struct my_biggy * + (((char *)w) - offsetof (struct my_biggy, t1)); + } + + static void + t2_cb (EV_P_ struct ev_timer *w, int revents) + { + struct my_biggy big = (struct my_biggy * + (((char *)w) - offsetof (struct my_biggy, t2)); + } + +</pre> + </div> -<h1 id="WATCHER_TYPES">WATCHER TYPES</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="WATCHER_TYPES">WATCHER TYPES</h1> <div id="WATCHER_TYPES_CONTENT"> <p>This section describes each watcher in detail, but will not repeat information given in the last section. Any initialisation/set macros, @@ -1562,7 +1590,7 @@ believe me.</p> </div> -<h1 id="OTHER_FUNCTIONS">OTHER FUNCTIONS</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="OTHER_FUNCTIONS">OTHER FUNCTIONS</h1> <div id="OTHER_FUNCTIONS_CONTENT"> <p>There are some other functions of possible interest. Described. Here. Now.</p> <dl> @@ -1619,7 +1647,7 @@ loop!).</p> </div> -<h1 id="LIBEVENT_EMULATION">LIBEVENT EMULATION</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="LIBEVENT_EMULATION">LIBEVENT EMULATION</h1> <div id="LIBEVENT_EMULATION_CONTENT"> <p>Libev offers a compatibility emulation layer for libevent. It cannot emulate the internals of libevent, so here are some usage hints:</p> @@ -1639,7 +1667,7 @@ to use the libev header file and library.</dt> </dl> </div> -<h1 id="C_SUPPORT">C++ SUPPORT</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="C_SUPPORT">C++ SUPPORT</h1> <div id="C_SUPPORT_CONTENT"> <p>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 @@ -1744,7 +1772,7 @@ the constructor.</p> </pre> </div> -<h1 id="MACRO_MAGIC">MACRO MAGIC</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="MACRO_MAGIC">MACRO MAGIC</h1> <div id="MACRO_MAGIC_CONTENT"> <p>Libev can be compiled with a variety of options, the most fundemantal is <code>EV_MULTIPLICITY</code>. This option determines wether (most) functions and @@ -1805,7 +1833,7 @@ wether multiple loops are supported or not.</p> </pre> </div> -<h1 id="EMBEDDING">EMBEDDING</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="EMBEDDING">EMBEDDING</h1> <div id="EMBEDDING_CONTENT"> <p>Libev can (and often is) directly embedded into host applications. Examples of applications that embed it include the Deliantra @@ -2109,7 +2137,7 @@ that everybody includes and which overrides some autoconf choices:</p> </pre> </div> -<h1 id="COMPLEXITIES">COMPLEXITIES</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="COMPLEXITIES">COMPLEXITIES</h1> <div id="COMPLEXITIES_CONTENT"> <p>In this section the complexities of (many of) the algorithms used inside libev will be explained. For complexity discussions about backends see the @@ -2132,7 +2160,7 @@ documentation for <code>ev_default_init</code>.</p> </div> -<h1 id="AUTHOR">AUTHOR</h1><p><a href="#TOP" class="toplink">Top</a></p> +<h1 id="AUTHOR">AUTHOR</h1> <div id="AUTHOR_CONTENT"> <p>Marc Lehmann <libev@schmorp.de>.</p> @@ -705,7 +705,7 @@ is pending (but not active) you must not call an init function on it (but C<ev_TYPE_set> is safe) and you must make sure the watcher is available to libev (e.g. you cnanot C<free ()> it). -=item callback = ev_cb (ev_TYPE *watcher) +=item callback ev_cb (ev_TYPE *watcher) Returns the callback currently set on the watcher. @@ -743,8 +743,37 @@ can cast it back to your own type: ... } -More interesting and less C-conformant ways of catsing your callback type -have been omitted.... +More interesting and less C-conformant ways of casting your callback type +instead have been omitted. + +Another common scenario is having some data structure with multiple +watchers: + + struct my_biggy + { + int some_data; + ev_timer t1; + ev_timer t2; + } + +In this case getting the pointer to C<my_biggy> is a bit more complicated, +you need to use C<offsetof>: + + #include <stddef.h> + + static void + t1_cb (EV_P_ struct ev_timer *w, int revents) + { + struct my_biggy big = (struct my_biggy * + (((char *)w) - offsetof (struct my_biggy, t1)); + } + + static void + t2_cb (EV_P_ struct ev_timer *w, int revents) + { + struct my_biggy big = (struct my_biggy * + (((char *)w) - offsetof (struct my_biggy, t2)); + } =head1 WATCHER TYPES |