annotate packages/devs/common/current/include/queuet.hxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_DEVS_COMMON_QUEUET_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_DEVS_COMMON_QUEUET_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 // queuet.hxx
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 // Generic queue template
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14 // The contents of this file are subject to the Cygnus eCos Public License
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 // Version 1.0 (the "License"); you may not use this file except in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 // compliance with the License. You may obtain a copy of the License at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 // The Initial Developer of the Original Code is Cygnus. Portions created
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
35 // Author(s): proven
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
36 // Contributors: proven
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
37 // Date: 1998-04-21
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 // Purpose: Create a template atomic queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 // Description: This file contains the implementations of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 // Cyg_Queuet
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 * Queue that allows two threads to interact with a queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 * without locking. One thread does queueing of useable buffers
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 * and dequeing of done buffers and one thread is the consumer.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 * Only n-1 elements may be queued at any time for a queue of n bytes.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 template <class T, cyg_count32 QUEUE_SIZE>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 class Cyg_Queuet
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 private:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 cyg_ucount32 next_free;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 cyg_ucount32 last_free;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 cyg_ucount32 next_inuse;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 cyg_ucount32 last_inuse;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 static const cyg_ucount32 queue_size = QUEUE_SIZE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 T * queue[ QUEUE_SIZE ];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 public: /* Routines for dealing with the queue */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 inline T *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 get_next_inuse(T * done)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 T * ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 CYG_ASSERT (next_inuse < queue_size, "next_inuse out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 CYG_ASSERT (last_inuse < queue_size, "last_inuse out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 if (done) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 (++last_inuse) %= queue_size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 if ((ret = queue[next_inuse]) != NULL) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 (++next_inuse) %= queue_size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 enqueue(T * next)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 CYG_ASSERT (next_free < queue_size, "next_free out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 CYG_ASSERT (queue[next_free] == NULL, "next_free is not NULL");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 CYG_ASSERT (min_free(), "not enough space to enqueue");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 queue[next_free++] = next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 next_free %= queue_size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 inline T *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 Cyg_Queuet::dequeue()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 T * ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 CYG_ASSERT (last_free < queue_size, "last_free out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 CYG_ASSERT (last_free != last_inuse, "no elements to dequeue");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 CYG_ASSERT (queue[last_free] != NULL, "queued element is NULL");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 ret = queue[last_free];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 queue[last_free++] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 last_free %= queue_size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 /* Assume producer is checking */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 inline cyg_ucount32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 Cyg_Queuet::min_done()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 cyg_count32 tmp;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 cyg_ucount32 ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 if (queue[last_free] != NULL) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 tmp = last_inuse - last_free;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 ret = (tmp < 0 ? tmp + queue_size : tmp);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 } else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 CYG_ASSERT (last_free == next_free,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 "last_free element is bogus");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 ret = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 /* Assume producer is checking */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 cyg_ucount32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 Cyg_Queuet::min_free()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 cyg_count32 tmp;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 cyg_ucount32 ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 CYG_ASSERT (next_free < queue_size, "next_free out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 CYG_ASSERT (last_free < queue_size, "last_free out of bounds");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 tmp = last_free - next_free;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 ret = (tmp <= 0 ? tmp + queue_size : tmp);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 /* Only n - 1 elements may be queued */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 return (ret - 1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 #endif // CYGONCE_DEVS_COMMON_QUEUET_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 // End of queuet.hxx
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154