123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /*
- * Mach Operating System
- * Copyright (c) 1991,1990,1989,1988,1987 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.
- */
- /*
- * Routines to implement queue package.
- */
- #include <kern/queue.h>
- /*
- * Insert element at head of queue.
- */
- void enqueue_head(
- queue_t que,
- queue_entry_t elt)
- {
- elt->next = que->next;
- elt->prev = que;
- elt->next->prev = elt;
- que->next = elt;
- }
- /*
- * Insert element at tail of queue.
- */
- void enqueue_tail(
- queue_t que,
- queue_entry_t elt)
- {
- elt->next = que;
- elt->prev = que->prev;
- elt->prev->next = elt;
- que->prev = elt;
- }
- /*
- * Remove and return element at head of queue.
- */
- queue_entry_t dequeue_head(
- queue_t que)
- {
- queue_entry_t elt;
- if (que->next == que)
- return((queue_entry_t)0);
- elt = que->next;
- elt->next->prev = que;
- que->next = elt->next;
- return(elt);
- }
- /*
- * Remove and return element at tail of queue.
- */
- queue_entry_t dequeue_tail(
- queue_t que)
- {
- queue_entry_t elt;
- if (que->prev == que)
- return((queue_entry_t)0);
- elt = que->prev;
- elt->prev->next = que;
- que->prev = elt->prev;
- return(elt);
- }
- /*
- * Remove arbitrary element from queue.
- * Does not check whether element is on queue - the world
- * will go haywire if it isn't.
- */
- /*ARGSUSED*/
- void remqueue(
- queue_t que,
- queue_entry_t elt)
- {
- elt->next->prev = elt->prev;
- elt->prev->next = elt->next;
- }
- /*
- * Routines to directly imitate the VAX hardware queue
- * package.
- */
- void insque(
- struct queue_entry *entry,
- struct queue_entry *pred)
- {
- entry->next = pred->next;
- entry->prev = pred;
- (pred->next)->prev = entry;
- pred->next = entry;
- }
- struct queue_entry
- *remque(
- struct queue_entry *elt)
- {
- (elt->next)->prev = elt->prev;
- (elt->prev)->next = elt->next;
- return(elt);
- }
|