… | |
… | |
117 | |
117 | |
118 | =item int ev_version_major () |
118 | =item int ev_version_major () |
119 | |
119 | |
120 | =item int ev_version_minor () |
120 | =item int ev_version_minor () |
121 | |
121 | |
122 | You can find out the major and minor version numbers of the library |
122 | You can find out the major and minor ABI version numbers of the library |
123 | you linked against by calling the functions C<ev_version_major> and |
123 | you linked against by calling the functions C<ev_version_major> and |
124 | C<ev_version_minor>. If you want, you can compare against the global |
124 | C<ev_version_minor>. If you want, you can compare against the global |
125 | symbols C<EV_VERSION_MAJOR> and C<EV_VERSION_MINOR>, which specify the |
125 | symbols C<EV_VERSION_MAJOR> and C<EV_VERSION_MINOR>, which specify the |
126 | version of the library your program was compiled against. |
126 | version of the library your program was compiled against. |
127 | |
127 | |
|
|
128 | These version numbers refer to the ABI version of the library, not the |
|
|
129 | release version. |
|
|
130 | |
128 | Usually, it's a good idea to terminate if the major versions mismatch, |
131 | Usually, it's a good idea to terminate if the major versions mismatch, |
129 | as this indicates an incompatible change. Minor versions are usually |
132 | as this indicates an incompatible change. Minor versions are usually |
130 | compatible to older versions, so a larger minor version alone is usually |
133 | compatible to older versions, so a larger minor version alone is usually |
131 | not a problem. |
134 | not a problem. |
132 | |
135 | |
133 | Example: Make sure we haven't accidentally been linked against the wrong |
136 | Example: Make sure we haven't accidentally been linked against the wrong |
134 | version. |
137 | version. |
… | |
… | |
908 | play around with an Xlib connection), then you have to seperately re-test |
911 | play around with an Xlib connection), then you have to seperately re-test |
909 | whether a file descriptor is really ready with a known-to-be good interface |
912 | whether a file descriptor is really ready with a known-to-be good interface |
910 | such as poll (fortunately in our Xlib example, Xlib already does this on |
913 | such as poll (fortunately in our Xlib example, Xlib already does this on |
911 | its own, so its quite safe to use). |
914 | its own, so its quite safe to use). |
912 | |
915 | |
|
|
916 | =head3 The special problem of disappearing file descriptors |
|
|
917 | |
|
|
918 | Some backends (e.g kqueue, epoll) need to be told about closing a file |
|
|
919 | descriptor (either by calling C<close> explicitly or by any other means, |
|
|
920 | such as C<dup>). The reason is that you register interest in some file |
|
|
921 | descriptor, but when it goes away, the operating system will silently drop |
|
|
922 | this interest. If another file descriptor with the same number then is |
|
|
923 | registered with libev, there is no efficient way to see that this is, in |
|
|
924 | fact, a different file descriptor. |
|
|
925 | |
|
|
926 | To avoid having to explicitly tell libev about such cases, libev follows |
|
|
927 | the following policy: Each time C<ev_io_set> is being called, libev |
|
|
928 | will assume that this is potentially a new file descriptor, otherwise |
|
|
929 | it is assumed that the file descriptor stays the same. That means that |
|
|
930 | you I<have> to call C<ev_io_set> (or C<ev_io_init>) when you change the |
|
|
931 | descriptor even if the file descriptor number itself did not change. |
|
|
932 | |
|
|
933 | This is how one would do it normally anyway, the important point is that |
|
|
934 | the libev application should not optimise around libev but should leave |
|
|
935 | optimisations to libev. |
|
|
936 | |
|
|
937 | |
913 | =over 4 |
938 | =over 4 |
914 | |
939 | |
915 | =item ev_io_init (ev_io *, callback, int fd, int events) |
940 | =item ev_io_init (ev_io *, callback, int fd, int events) |
916 | |
941 | |
917 | =item ev_io_set (ev_io *, int fd, int events) |
942 | =item ev_io_set (ev_io *, int fd, int events) |