#ifndef foothreadedwatchhfoo
#define foothreadedwatchhfoo

/***
  This file is part of avahi.

  avahi is free software; you can redistribute it and/or modify it
  under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the
  License, or (at your option) any later version.

  avahi is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
  Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with avahi; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  USA.
***/

/** \file thread-watch.h Threaded poll() based main loop implementation */

#include <sys/poll.h>
#include <avahi-common/cdecl.h>
#include <avahi-common/watch.h>

AVAHI_C_DECL_BEGIN

/** A main loop object that runs an AvahiSimplePoll in its own thread. \since 0.6.4 */
typedef struct AvahiThreadedPoll AvahiThreadedPoll;

/** Create a new event loop object. This will allocate the internal
 * AvahiSimplePoll, but will not start the helper thread. \since 0.6.4 */
AvahiThreadedPoll *avahi_threaded_poll_new(void);

/** Free an event loop object. This will stop the associated event loop
 * thread (if it is running). \since 0.6.4 */
void avahi_threaded_poll_free(AvahiThreadedPoll *p);

/** Return the abstracted poll API object for this event loop
 * object. The will return the same pointer each time it is
 * called. \since 0.6.4 */
const AvahiPoll* avahi_threaded_poll_get(AvahiThreadedPoll *p);

/** Start the event loop helper thread. After the thread has started
 * you must make sure to access the event loop object
 * (AvahiThreadedPoll, AvahiPoll and all its associated objects)
 * synchronized, i.e. with proper locking. You may want to use
 * avahi_threaded_poll_lock()/avahi_threaded_poll_unlock() for this,
 * which will lock the the entire event loop. Please note that event
 * loop callback functions are called from the event loop helper thread
 * with that lock held, i.e. avahi_threaded_poll_lock() calls are not
 * required from event callbacks. \since 0.6.4 */
int avahi_threaded_poll_start(AvahiThreadedPoll *p);

/** Request that the event loop quits and the associated thread
 stops. Call this from outside the helper thread if you want to shut
 it down. \since 0.6.4 */
int avahi_threaded_poll_stop(AvahiThreadedPoll *p);

/** Request that the event loop quits and the associated thread
 stops. Call this from inside the helper thread if you want to shut it
 down. \since 0.6.4  */
void avahi_threaded_poll_quit(AvahiThreadedPoll *p);

/** Lock the main loop object. Use this if you want to access the event
 * loop objects (such as creating a new event source) from anything
 * else but the event loop helper thread, i.e. from anything else but event
 * loop callbacks \since 0.6.4  */
void avahi_threaded_poll_lock(AvahiThreadedPoll *p);

/** Unlock the event loop object, use this as counterpart to
 * avahi_threaded_poll_lock() \since 0.6.4 */
void avahi_threaded_poll_unlock(AvahiThreadedPoll *p);

AVAHI_C_DECL_END

#endif
