On Tue, 05.08.08 14:27, Nathan Huesken ([EMAIL PROTECTED]) wrote: > Hello, > > I am new to avahi and I am a little unsure about how to integrate it > into an existing application. What I have to do, is call > "avahi_simple_poll_iterate" on regular intervalls, correct?
Oh no, please don't! The avahi client libraries can be integrated in several ways into foreign event loops, but doing it based on regularly called timers is the worst. It burns CPU for nothing, and still delays Avahi event dispatching unnecessarily. This is really, really bad style. Using timeouts this way is blatant misuse. You have several options that are far more elegant: 1) Implement the AvahiPoll structure for your existing event loop, i.e. implement the seven functions defined here: http://avahi.org/download/doxygen/struct_avahi_poll.html Then, pass this struct to avahi_client_new() and the avahi client will call those functions whenever there is a new FD or timeout to sleep on. You should then add a new item to your "struct pollfd" array (in case you uses poll()) or fd_set (in case you use select()) everytime the watch_new() function you implemented is called by the avahi client libraries, and similarly for the other six functions you'd need to implement. 2) A basic event loop implementation that provides AvahiPoll is AvahiSimplePoll. You could change your program to use this as event loop implementation instead of a home-grown select()/poll() loop. 3) A event loop adapter that provides AvahiPoll is AvahiGLibPoll that allows you to use the GLib event loop (which is relatively powerful and good code) and run the Avahi client on top. Requires you to adopt the GLib main loop in your program of course. A Qt event loop adapter is available, too. 4) If you don't want to write the glue code to implement AvahiPoll on top of your existing event loop, and you don't want to replace your current event loop code with AvahiSimplePoll or AvahiGLibPoll you can instead use AvahiThreadedPoll which runs an Avahi-specific event loop in a seperate thread and leaves your main event loop untouched. This is sometimes a good idea, i.e. when you cannot change the main event loop because you don't control the code or reasons like that. While this might look the easiest way to do it at first be aware that as soon as you want to exchange data between the avahi loop and your main event loop you have to think about locking/synchronization and stuff which requires a good understanding of how threading works. There is a small introduction how to use AvahiThreadedPool in the wiki: http://avahi.org/wiki/RunningAvahiClientAsThread Avahi's are very flexible when it comes to integrating them into foreign event loops. Again, doing it via interval timers is the worst way. BTW Lennart -- Lennart Poettering Red Hat, Inc. lennart [at] poettering [dot] net ICQ# 11060553 http://0pointer.net/lennart/ GnuPG 0x1A015CC4 _______________________________________________ avahi mailing list avahi@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/avahi