]> git.llucax.com Git - software/libev.git/blobdiff - ev.html
*** empty log message ***
[software/libev.git] / ev.html
diff --git a/ev.html b/ev.html
index e1af75a0103468dabc7bb92b81a4849cc926982c..0299995080d1a4bf51562dbe0898618e58e26833 100644 (file)
--- a/ev.html
+++ b/ev.html
@@ -6,7 +6,7 @@
        <meta name="description" content="Pod documentation for libev" />
        <meta name="inputfile" content="&lt;standard input&gt;" />
        <meta name="outputfile" content="&lt;standard output&gt;" />
-       <meta name="created" content="Sun Dec  9 20:45:16 2007" />
+       <meta name="created" content="Wed Dec 12 18:55:04 2007" />
        <meta name="generator" content="Pod::Xhtml 1.57" />
 <link rel="stylesheet" href="http://res.tst.eu/pod.css"/></head>
 <body>
 </ul>
 </li>
 <li><a href="#WATCHER_TYPES">WATCHER TYPES</a>
-<ul><li><a href="#code_ev_io_code_is_this_file_descrip"><code>ev_io</code> - is this file descriptor readable or writable?</a></li>
-<li><a href="#code_ev_timer_code_relative_and_opti"><code>ev_timer</code> - relative and optionally repeating timeouts</a></li>
-<li><a href="#code_ev_periodic_code_to_cron_or_not"><code>ev_periodic</code> - to cron or not to cron?</a></li>
-<li><a href="#code_ev_signal_code_signal_me_when_a"><code>ev_signal</code> - signal me when a signal gets signalled!</a></li>
-<li><a href="#code_ev_child_code_watch_out_for_pro"><code>ev_child</code> - watch out for process status changes</a></li>
-<li><a href="#code_ev_stat_code_did_the_file_attri"><code>ev_stat</code> - did the file attributes just change?</a></li>
-<li><a href="#code_ev_idle_code_when_you_ve_got_no"><code>ev_idle</code> - when you've got nothing better to do...</a></li>
-<li><a href="#code_ev_prepare_code_and_code_ev_che"><code>ev_prepare</code> and <code>ev_check</code> - customise your event loop!</a></li>
-<li><a href="#code_ev_embed_code_when_one_backend_"><code>ev_embed</code> - when one backend isn't enough...</a></li>
+<ul><li><a href="#code_ev_io_code_is_this_file_descrip"><code>ev_io</code> - is this file descriptor readable or writable?</a>
+<ul><li><a href="#The_special_problem_of_disappearing_">The special problem of disappearing file descriptors</a></li>
+<li><a href="#Watcher_Specific_Functions">Watcher-Specific Functions</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_timer_code_relative_and_opti"><code>ev_timer</code> - relative and optionally repeating timeouts</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_periodic_code_to_cron_or_not"><code>ev_periodic</code> - to cron or not to cron?</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-3">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_signal_code_signal_me_when_a"><code>ev_signal</code> - signal me when a signal gets signalled!</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-4">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_child_code_watch_out_for_pro"><code>ev_child</code> - watch out for process status changes</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-5">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_stat_code_did_the_file_attri"><code>ev_stat</code> - did the file attributes just change?</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-6">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_idle_code_when_you_ve_got_no"><code>ev_idle</code> - when you've got nothing better to do...</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-7">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_prepare_code_and_code_ev_che"><code>ev_prepare</code> and <code>ev_check</code> - customise your event loop!</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-8">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
+<li><a href="#code_ev_embed_code_when_one_backend_"><code>ev_embed</code> - when one backend isn't enough...</a>
+<ul><li><a href="#Watcher_Specific_Functions_and_Data_-9">Watcher-Specific Functions and Data Members</a></li>
+</ul>
+</li>
 <li><a href="#code_ev_fork_code_the_audacity_to_re"><code>ev_fork</code> - the audacity to resume the event loop after a fork</a></li>
 </ul>
 </li>
@@ -187,13 +215,13 @@ you actually want to know.</p>
        <dt>int ev_version_major ()</dt>
        <dt>int ev_version_minor ()</dt>
        <dd>
-               <p>You can find out the major and minor API/ABI version numbers of the library
+               <p>You can find out the major and minor ABI version numbers of the library
 you linked against by calling the functions <code>ev_version_major</code> and
 <code>ev_version_minor</code>. If you want, you can compare against the global
 symbols <code>EV_VERSION_MAJOR</code> and <code>EV_VERSION_MINOR</code>, which specify the
 version of the library your program was compiled against.</p>
-               <p>These version numbers refer to the API and ABI version of the library, not
-the release version.</p>
+               <p>These version numbers refer to the ABI version of the library, not the
+release version.</p>
                <p>Usually, it's a good idea to terminate if the major versions mismatch,
 as this indicates an incompatible change. Minor versions are usually
 compatible to older versions, so a larger minor version alone is usually
@@ -943,6 +971,34 @@ play around with an Xlib connection), then you have to seperately re-test
 whether a file descriptor is really ready with a known-to-be good interface
 such as poll (fortunately in our Xlib example, Xlib already does this on
 its own, so its quite safe to use).</p>
+
+</div>
+<h3 id="The_special_problem_of_disappearing_">The special problem of disappearing file descriptors</h3>
+<div id="The_special_problem_of_disappearing_-2">
+<p>Some backends (e.g kqueue, epoll) need to be told about closing a file
+descriptor (either by calling <code>close</code> explicitly or by any other means,
+such as <code>dup</code>). The reason is that you register interest in some file
+descriptor, but when it goes away, the operating system will silently drop
+this interest. If another file descriptor with the same number then is
+registered with libev, there is no efficient way to see that this is, in
+fact, a different file descriptor.</p>
+<p>To avoid having to explicitly tell libev about such cases, libev follows
+the following policy:  Each time <code>ev_io_set</code> is being called, libev
+will assume that this is potentially a new file descriptor, otherwise
+it is assumed that the file descriptor stays the same. That means that
+you <i>have</i> to call <code>ev_io_set</code> (or <code>ev_io_init</code>) when you change the
+descriptor even if the file descriptor number itself did not change.</p>
+<p>This is how one would do it normally anyway, the important point is that
+the libev application should not optimise around libev but should leave
+optimisations to libev.</p>
+
+
+
+
+
+</div>
+<h3 id="Watcher_Specific_Functions">Watcher-Specific Functions</h3>
+<div id="Watcher_Specific_Functions_CONTENT">
 <dl>
        <dt>ev_io_init (ev_io *, callback, int fd, int events)</dt>
        <dt>ev_io_set (ev_io *, int fd, int events)</dt>
@@ -1003,6 +1059,10 @@ on the current time, use something like this to adjust for this:</p>
 <p>The callback is guarenteed to be invoked only when its timeout has passed,
 but if multiple timers become ready during the same loop iteration then
 order of execution is undefined.</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2">
 <dl>
        <dt>ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)</dt>
        <dt>ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)</dt>
@@ -1108,6 +1168,10 @@ rules.</p>
 <p>As with timers, the callback is guarenteed to be invoked only when the
 time (<code>at</code>) has been passed, but if multiple periodic timers become ready
 during the same loop iteration then order of execution is undefined.</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-3">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2">
 <dl>
        <dt>ev_periodic_init (ev_periodic *, callback, ev_tstamp at, ev_tstamp interval, reschedule_cb)</dt>
        <dt>ev_periodic_set (ev_periodic *, ev_tstamp after, ev_tstamp repeat, reschedule_cb)</dt>
@@ -1254,6 +1318,10 @@ with the kernel (thus it coexists with your own signal handlers as long
 as you don't register any with libev). Similarly, when the last signal
 watcher for a signal is stopped libev will reset the signal handler to
 SIG_DFL (regardless of what it was set to before).</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-4">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-2">
 <dl>
        <dt>ev_signal_init (ev_signal *, callback, int signum)</dt>
        <dt>ev_signal_set (ev_signal *, int signum)</dt>
@@ -1276,6 +1344,10 @@ of the <code>SIGxxx</code> constants).</p>
 <div id="code_ev_child_code_watch_out_for_pro-2">
 <p>Child watchers trigger when your process receives a SIGCHLD in response to
 some child status changes (most typically when a child of yours dies).</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-5">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-3">
 <dl>
        <dt>ev_child_init (ev_child *, callback, int pid)</dt>
        <dt>ev_child_set (ev_child *, int pid)</dt>
@@ -1348,6 +1420,10 @@ semantics of <code>ev_stat</code> watchers, which means that libev sometimes nee
 to fall back to regular polling again even with inotify, but changes are
 usually detected immediately, and if the file exists there will be no
 polling.</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-6">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-4">
 <dl>
        <dt>ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)</dt>
        <dt>ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)</dt>
@@ -1435,6 +1511,10 @@ active, the process will not block when waiting for new events.</p>
 effect on its own sometimes), idle watchers are a good place to do
 &quot;pseudo-background processing&quot;, or delay processing stuff to after the
 event loop has handled all outstanding events.</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-7">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-5">
 <dl>
        <dt>ev_idle_init (ev_signal *, callback)</dt>
        <dd>
@@ -1507,6 +1587,10 @@ their job. As <code>ev_check</code> watchers are often used to embed other event
 loops those other event loops might be in an unusable state until their
 <code>ev_check</code> watcher ran (always remind yourself to coexist peacefully with
 others).</p>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-8">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-6">
 <dl>
        <dt>ev_prepare_init (ev_prepare *, callback)</dt>
        <dt>ev_check_init (ev_check *, callback)</dt>
@@ -1708,6 +1792,10 @@ create it, and if that fails, use the normal loop for everything:</p>
     loop_lo = loop_hi;
 
 </pre>
+
+</div>
+<h3 id="Watcher_Specific_Functions_and_Data_-9">Watcher-Specific Functions and Data Members</h3>
+<div id="Watcher_Specific_Functions_and_Data_-2-7">
 <dl>
        <dt>ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)</dt>
        <dt>ev_embed_set (ev_embed *, callback, struct ev_loop *embedded_loop)</dt>