home *** CD-ROM | disk | FTP | other *** search
- /*
- * Mach Operating System
- * Copyright (c) 1992 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
- /*
- * HISTORY
- * $Log: queue.h,v $
- * Revision 2.1 92/04/21 17:17:51 rwd
- * BSDSS
- *
- *
- */
-
- #ifndef _QUEUE_
- #define _QUEUE_
-
- /*
- * Queue of abstract objects. Queue is maintained
- * within that object.
- *
- * Supports fast removal from within the queue.
- *
- * How to declare a queue of elements of type "foo_t":
- * In the "*foo_t" type, you must have a field of
- * type "queue_chain_t" to hold together this queue.
- * There may be more than one chain through a
- * "foo_t", for use by different queues.
- *
- * Declare the queue as a "queue_t" type.
- *
- * Elements of the queue (of type "foo_t", that is)
- * are referred to by reference, and cast to type
- * "queue_entry_t" within this module.
- */
-
- /*
- * A generic doubly-linked list (queue).
- */
-
- struct queue_entry {
- struct queue_entry *next; /* next element */
- struct queue_entry *prev; /* previous element */
- };
-
- typedef struct queue_entry *queue_t;
- typedef struct queue_entry queue_head_t;
- typedef struct queue_entry queue_chain_t;
- typedef struct queue_entry *queue_entry_t;
-
- /*
- * enqueue puts "elt" on the "queue".
- * dequeue returns the first element in the "queue".
- * remqueue removes the specified "elt" from the specified "queue".
- */
-
- #define enqueue(queue,elt) enqueue_tail(queue, elt)
- #define dequeue(queue) dequeue_head(queue)
-
- void enqueue_head();
- void enqueue_tail();
- queue_entry_t dequeue_head();
- queue_entry_t dequeue_tail();
- void remqueue();
-
- /*
- * Macro: queue_init
- * Function:
- * Initialize the given queue.
- * Header:
- * void queue_init(q)
- * queue_t q; /* MODIFIED *\
- */
- #define queue_init(q) ((q)->next = (q)->prev = q)
-
- /*
- * Macro: queue_first
- * Function:
- * Returns the first entry in the queue,
- * Header:
- * queue_entry_t queue_first(q)
- * queue_t q; /* IN *\
- */
- #define queue_first(q) ((q)->next)
-
- /*
- * Macro: queue_next
- * Header:
- * queue_entry_t queue_next(qc)
- * queue_t qc;
- */
- #define queue_next(qc) ((qc)->next)
-
- /*
- * Macro: queue_end
- * Header:
- * boolean_t queue_end(q, qe)
- * queue_t q;
- * queue_entry_t qe;
- */
- #define queue_end(q, qe) ((q) == (qe))
-
- #define queue_empty(q) queue_end((q), queue_first(q))
-
- /*
- * Macro: queue_enter
- * Header:
- * void queue_enter(q, elt, type, field)
- * queue_t q;
- * <type> elt;
- * <type> is what's in our queue
- * <field> is the chain field in (*<type>)
- */
- #define queue_enter(head, elt, type, field) \
- { \
- if (queue_empty((head))) { \
- (head)->next = (queue_entry_t) elt; \
- (head)->prev = (queue_entry_t) elt; \
- (elt)->field.next = head; \
- (elt)->field.prev = head; \
- } \
- else { \
- register queue_entry_t prev; \
- \
- prev = (head)->prev; \
- (elt)->field.prev = prev; \
- (elt)->field.next = head; \
- (head)->prev = (queue_entry_t)(elt); \
- ((type)prev)->field.next = (queue_entry_t)(elt);\
- } \
- }
-
- /*
- * Macro: queue_field [internal use only]
- * Function:
- * Find the queue_chain_t (or queue_t) for the
- * given element (thing) in the given queue (head)
- */
- #define queue_field(head, thing, type, field) \
- (((head) == (thing)) ? (head) : &((type)(thing))->field)
-
- /*
- * Macro: queue_remove
- * Header:
- * void queue_remove(q, qe, type, field)
- * arguments as in queue_enter
- */
- #define queue_remove(head, elt, type, field) \
- { \
- register queue_entry_t next, prev; \
- \
- next = (elt)->field.next; \
- prev = (elt)->field.prev; \
- \
- queue_field((head), next, type, field)->prev = prev; \
- queue_field((head), prev, type, field)->next = next; \
- }
-
- /*
- * Macro: queue_assign
- */
- #define queue_assign(to, from, type, field) \
- { \
- ((type)((from)->prev))->field.next = (to); \
- ((type)((from)->next))->field.prev = (to); \
- *to = *from; \
- }
-
- #define queue_remove_first(h, e, t, f) \
- { \
- e = (t) queue_first((h)); \
- queue_remove((h), (e), t, f); \
- }
-
- #define queue_remove_last(h, e, t, f) \
- { \
- e = (t) queue_last((h)); \
- queue_remove((h), (e), t, f); \
- }
-
- /*
- * Macro: queue_enter_first
- * Header:
- * void queue_enter_first(q, elt, type, field)
- * queue_t q;
- * <type> elt;
- * <type> is what's in our queue
- * <field> is the chain field in (*<type>)
- */
- #define queue_enter_first(head, elt, type, field) \
- { \
- if (queue_empty((head))) { \
- (head)->next = (queue_entry_t) elt; \
- (head)->prev = (queue_entry_t) elt; \
- (elt)->field.next = head; \
- (elt)->field.prev = head; \
- } \
- else { \
- register queue_entry_t next; \
- \
- next = (head)->next; \
- (elt)->field.prev = head; \
- (elt)->field.next = next; \
- (head)->next = (queue_entry_t)(elt); \
- ((type)next)->field.prev = (queue_entry_t)(elt);\
- } \
- }
-
- /*
- * Macro: queue_last
- * Function:
- * Returns the last entry in the queue,
- * Header:
- * queue_entry_t queue_last(q)
- * queue_t q; /* IN *\
- */
- #define queue_last(q) ((q)->prev)
-
- /*
- * Macro: queue_prev
- * Header:
- * queue_entry_t queue_prev(qc)
- * queue_t qc;
- */
- #define queue_prev(qc) ((qc)->prev)
-
- /*
- * Old queue stuff, will go away soon.
- */
-
- /*
- **********************************************************************
- * HISTORY
- * 21-May-85 Mike Accetta (mja) at Carnegie-Mellon University
- * Upgraded to 4.2BSD. Changed to enQueue()/deQueue() names
- * to avoid conflicts with 4.2 dequeue().
- * [V1(1)]
- *
- * 06-Mar-80 Rick Rashid (rfr) at Carnegie-Mellon University
- * Created (V1.05).
- *
- **********************************************************************
- */
-
- /*
- * General purpose structure to define circular queues.
- * Both the queue header and the queue elements have this
- * structure.
- */
-
- struct Queue
- {
- struct Queue * F;
- struct Queue * B;
- };
-
- #define initQueue(q) (queue_init((queue_t)(q)))
- #define enQueue(q,elt) (enqueue_tail((queue_t)(q),(queue_entry_t)(elt)))
- #define deQueue(q) ((struct Queue *)dequeue_head((queue_t)(q)))
- #define remQueue(q,elt) (remqueue((queue_t)(q),(queue_entry_t)(elt)))
- #define Queueempty(q) (queue_empty((queue_t)(q)))
-
- #endif _QUEUE_
-