/* GLIB - Library of useful routines for C programming
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library 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 of the License, or (at your option) any later version.
 *
 * This library 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 this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
 * file for a list of people on the GLib Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GLib at ftp://ftp.gtk.org/pub/gtk/. 
 */

#ifndef __G_ASYNCQUEUE_H__
#define __G_ASYNCQUEUE_H__

#include <glib/gthread.h>

G_BEGIN_DECLS

typedef struct _GAsyncQueue     GAsyncQueue;

/* Asyncronous Queues, can be used to communicate between threads
 */

/* Get a new GAsyncQueue with the ref_count 1 */
GAsyncQueue*  g_async_queue_new                (void);

/* Lock and unlock a GAsyncQueue. All functions lock the queue for
 * themselves, but in certain cirumstances you want to hold the lock longer,
 * thus you lock the queue, call the *_unlocked functions and unlock it again.
 */
void          g_async_queue_lock               (GAsyncQueue *queue);
void          g_async_queue_unlock             (GAsyncQueue *queue);

/* Ref and unref the GAsyncQueue. */
GAsyncQueue*  g_async_queue_ref                (GAsyncQueue *queue);
void          g_async_queue_unref              (GAsyncQueue *queue);
#ifndef G_DISABLE_DEPRECATED
/* You don't have to hold the lock for calling *_ref and *_unref anymore. */
void          g_async_queue_ref_unlocked       (GAsyncQueue *queue);
void          g_async_queue_unref_and_unlock   (GAsyncQueue *queue);
#endif /* !G_DISABLE_DEPRECATED */

/* Push data into the async queue. Must not be NULL. */
void          g_async_queue_push               (GAsyncQueue *queue,
                                                gpointer     data);
void          g_async_queue_push_unlocked      (GAsyncQueue *queue,
                                                gpointer     data);

/* Pop data from the async queue. When no data is there, the thread is blocked
 * until data arrives. */
gpointer      g_async_queue_pop                (GAsyncQueue *queue);
gpointer      g_async_queue_pop_unlocked       (GAsyncQueue *queue);

/* Try to pop data. NULL is returned in case of empty queue. */
gpointer      g_async_queue_try_pop            (GAsyncQueue *queue);
gpointer      g_async_queue_try_pop_unlocked   (GAsyncQueue *queue);

/* Wait for data until at maximum until end_time is reached. NULL is returned
 * in case of empty queue. */
gpointer      g_async_queue_timed_pop          (GAsyncQueue *queue,
                                                GTimeVal    *end_time);
gpointer      g_async_queue_timed_pop_unlocked (GAsyncQueue *queue,
                                                GTimeVal    *end_time);

/* Return the length of the queue. Negative values mean that threads
 * are waiting, positve values mean that there are entries in the
 * queue. Actually this function returns the length of the queue minus
 * the number of waiting threads, g_async_queue_length == 0 could also
 * mean 'n' entries in the queue and 'n' thread waiting. Such can
 * happen due to locking of the queue or due to scheduling. */
gint          g_async_queue_length             (GAsyncQueue *queue);
gint          g_async_queue_length_unlocked    (GAsyncQueue *queue);

G_END_DECLS

#endif /* __G_ASYNCQUEUE_H__ */

