… | |
… | |
247 | the current system, you would need to look at C<ev_embeddable_backends () |
247 | the current system, you would need to look at C<ev_embeddable_backends () |
248 | & ev_supported_backends ()>, likewise for recommended ones. |
248 | & ev_supported_backends ()>, likewise for recommended ones. |
249 | |
249 | |
250 | See the description of C<ev_embed> watchers for more info. |
250 | See the description of C<ev_embed> watchers for more info. |
251 | |
251 | |
252 | =item ev_set_allocator (void *(*cb)(void *ptr, long size)) |
252 | =item ev_set_allocator (void *(*cb)(void *ptr, long size) throw ()) |
253 | |
253 | |
254 | Sets the allocation function to use (the prototype is similar - the |
254 | Sets the allocation function to use (the prototype is similar - the |
255 | semantics are identical to the C<realloc> C89/SuS/POSIX function). It is |
255 | semantics are identical to the C<realloc> C89/SuS/POSIX function). It is |
256 | used to allocate and free memory (no surprises here). If it returns zero |
256 | used to allocate and free memory (no surprises here). If it returns zero |
257 | when memory needs to be allocated (C<size != 0>), the library might abort |
257 | when memory needs to be allocated (C<size != 0>), the library might abort |
… | |
… | |
283 | } |
283 | } |
284 | |
284 | |
285 | ... |
285 | ... |
286 | ev_set_allocator (persistent_realloc); |
286 | ev_set_allocator (persistent_realloc); |
287 | |
287 | |
288 | =item ev_set_syserr_cb (void (*cb)(const char *msg)) |
288 | =item ev_set_syserr_cb (void (*cb)(const char *msg) throw ()) |
289 | |
289 | |
290 | Set the callback function to call on a retryable system call error (such |
290 | Set the callback function to call on a retryable system call error (such |
291 | as failed select, poll, epoll_wait). The message is a printable string |
291 | as failed select, poll, epoll_wait). The message is a printable string |
292 | indicating the system call or subsystem causing the problem. If this |
292 | indicating the system call or subsystem causing the problem. If this |
293 | callback is set, then libev will expect it to remedy the situation, no |
293 | callback is set, then libev will expect it to remedy the situation, no |
… | |
… | |
1016 | invoke the actual watchers inside another context (another thread etc.). |
1016 | invoke the actual watchers inside another context (another thread etc.). |
1017 | |
1017 | |
1018 | If you want to reset the callback, use C<ev_invoke_pending> as new |
1018 | If you want to reset the callback, use C<ev_invoke_pending> as new |
1019 | callback. |
1019 | callback. |
1020 | |
1020 | |
1021 | =item ev_set_loop_release_cb (loop, void (*release)(EV_P), void (*acquire)(EV_P)) |
1021 | =item ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ()) |
1022 | |
1022 | |
1023 | Sometimes you want to share the same loop between multiple threads. This |
1023 | Sometimes you want to share the same loop between multiple threads. This |
1024 | can be done relatively simply by putting mutex_lock/unlock calls around |
1024 | can be done relatively simply by putting mutex_lock/unlock calls around |
1025 | each call to a libev function. |
1025 | each call to a libev function. |
1026 | |
1026 | |
… | |
… | |
3897 | |
3897 | |
3898 | =back |
3898 | =back |
3899 | |
3899 | |
3900 | =head1 C++ SUPPORT |
3900 | =head1 C++ SUPPORT |
3901 | |
3901 | |
|
|
3902 | =head2 C API |
|
|
3903 | |
|
|
3904 | The normal C API should work fine when used from C++: both ev.h and the |
|
|
3905 | libev sources can be compiled as C++. Therefore, code that uses the C API |
|
|
3906 | will work fine. |
|
|
3907 | |
|
|
3908 | Proper exception specifications might have to be added to callbacks passed |
|
|
3909 | to libev: exceptions may be thrown only from watcher callbacks, all |
|
|
3910 | other callbacks (allocator, syserr, loop acquire/release and periodioc |
|
|
3911 | reschedule callbacks) must not throw exceptions, and might need a C<throw |
|
|
3912 | ()> specification. If you have code that needs to be compiled as both C |
|
|
3913 | and C++ you can use the C<EV_THROW> macro for this: |
|
|
3914 | |
|
|
3915 | static void |
|
|
3916 | fatal_error (const char *msg) EV_THROW |
|
|
3917 | { |
|
|
3918 | perror (msg); |
|
|
3919 | abort (); |
|
|
3920 | } |
|
|
3921 | |
|
|
3922 | ... |
|
|
3923 | ev_set_syserr_cb (fatal_error); |
|
|
3924 | |
|
|
3925 | The only API functions that can currently throw exceptions are C<ev_run>, |
|
|
3926 | C<ev_inoke>, C<ev_invoke_pending> and C<ev_loop_destroy> (the latter |
|
|
3927 | because it runs cleanup watchers). |
|
|
3928 | |
|
|
3929 | Throwing exceptions in watcher callbacks is only supported if libev itself |
|
|
3930 | is compiled with a C++ compiler or your C and C++ environments allow |
|
|
3931 | throwing exceptions through C libraries (most do). |
|
|
3932 | |
|
|
3933 | =head2 C++ API |
|
|
3934 | |
3902 | Libev comes with some simplistic wrapper classes for C++ that mainly allow |
3935 | Libev comes with some simplistic wrapper classes for C++ that mainly allow |
3903 | you to use some convenience methods to start/stop watchers and also change |
3936 | you to use some convenience methods to start/stop watchers and also change |
3904 | the callback model to a model using method callbacks on objects. |
3937 | the callback model to a model using method callbacks on objects. |
3905 | |
3938 | |
3906 | To use it, |
3939 | To use it, |
… | |
… | |
4620 | #define EV_USE_POLL 1 |
4653 | #define EV_USE_POLL 1 |
4621 | #define EV_CHILD_ENABLE 1 |
4654 | #define EV_CHILD_ENABLE 1 |
4622 | #define EV_ASYNC_ENABLE 1 |
4655 | #define EV_ASYNC_ENABLE 1 |
4623 | |
4656 | |
4624 | The actual value is a bitset, it can be a combination of the following |
4657 | The actual value is a bitset, it can be a combination of the following |
4625 | values: |
4658 | values (by default, all of these are enabled): |
4626 | |
4659 | |
4627 | =over 4 |
4660 | =over 4 |
4628 | |
4661 | |
4629 | =item C<1> - faster/larger code |
4662 | =item C<1> - faster/larger code |
4630 | |
4663 | |
… | |
… | |
4634 | code size by roughly 30% on amd64). |
4667 | code size by roughly 30% on amd64). |
4635 | |
4668 | |
4636 | When optimising for size, use of compiler flags such as C<-Os> with |
4669 | When optimising for size, use of compiler flags such as C<-Os> with |
4637 | gcc is recommended, as well as C<-DNDEBUG>, as libev contains a number of |
4670 | gcc is recommended, as well as C<-DNDEBUG>, as libev contains a number of |
4638 | assertions. |
4671 | assertions. |
|
|
4672 | |
|
|
4673 | The default is off when C<__OPTIMIZE_SIZE__> is defined by your compiler |
|
|
4674 | (e.g. gcc with C<-Os>). |
4639 | |
4675 | |
4640 | =item C<2> - faster/larger data structures |
4676 | =item C<2> - faster/larger data structures |
4641 | |
4677 | |
4642 | Replaces the small 2-heap for timer management by a faster 4-heap, larger |
4678 | Replaces the small 2-heap for timer management by a faster 4-heap, larger |
4643 | hash table sizes and so on. This will usually further increase code size |
4679 | hash table sizes and so on. This will usually further increase code size |
4644 | and can additionally have an effect on the size of data structures at |
4680 | and can additionally have an effect on the size of data structures at |
4645 | runtime. |
4681 | runtime. |
|
|
4682 | |
|
|
4683 | The default is off when C<__OPTIMIZE_SIZE__> is defined by your compiler |
|
|
4684 | (e.g. gcc with C<-Os>). |
4646 | |
4685 | |
4647 | =item C<4> - full API configuration |
4686 | =item C<4> - full API configuration |
4648 | |
4687 | |
4649 | This enables priorities (sets C<EV_MAXPRI>=2 and C<EV_MINPRI>=-2), and |
4688 | This enables priorities (sets C<EV_MAXPRI>=2 and C<EV_MINPRI>=-2), and |
4650 | enables multiplicity (C<EV_MULTIPLICITY>=1). |
4689 | enables multiplicity (C<EV_MULTIPLICITY>=1). |