|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * Routines to implement queue package.
28: */
29:
30: #include <kern/queue.h>
31:
32:
33:
34: /*
35: * Insert element at head of queue.
36: */
37: void enqueue_head(
38: register queue_t que,
39: register queue_entry_t elt)
40: {
41: elt->next = que->next;
42: elt->prev = que;
43: elt->next->prev = elt;
44: que->next = elt;
45: }
46:
47: /*
48: * Insert element at tail of queue.
49: */
50: void enqueue_tail(
51: register queue_t que,
52: register queue_entry_t elt)
53: {
54: elt->next = que;
55: elt->prev = que->prev;
56: elt->prev->next = elt;
57: que->prev = elt;
58: }
59:
60: /*
61: * Remove and return element at head of queue.
62: */
63: queue_entry_t dequeue_head(
64: register queue_t que)
65: {
66: register queue_entry_t elt;
67:
68: if (que->next == que)
69: return((queue_entry_t)0);
70:
71: elt = que->next;
72: elt->next->prev = que;
73: que->next = elt->next;
74: return(elt);
75: }
76:
77: /*
78: * Remove and return element at tail of queue.
79: */
80: queue_entry_t dequeue_tail(
81: register queue_t que)
82: {
83: register queue_entry_t elt;
84:
85: if (que->prev == que)
86: return((queue_entry_t)0);
87:
88: elt = que->prev;
89: elt->prev->next = que;
90: que->prev = elt->prev;
91: return(elt);
92: }
93:
94: /*
95: * Remove arbitrary element from queue.
96: * Does not check whether element is on queue - the world
97: * will go haywire if it isn't.
98: */
99:
100: /*ARGSUSED*/
101: void remqueue(
102: queue_t que,
103: register queue_entry_t elt)
104: {
105: elt->next->prev = elt->prev;
106: elt->prev->next = elt->next;
107: }
108:
109: /*
110: * Routines to directly imitate the VAX hardware queue
111: * package.
112: */
113: void insque(
114: register struct queue_entry *entry,
115: register struct queue_entry *pred)
116: {
117: entry->next = pred->next;
118: entry->prev = pred;
119: (pred->next)->prev = entry;
120: pred->next = entry;
121: }
122:
123: struct queue_entry
124: *remque(
125: register struct queue_entry *elt)
126: {
127: (elt->next)->prev = elt->prev;
128: (elt->prev)->next = elt->next;
129: return(elt);
130: }
131:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.