Subversion Repositories Kolibri OS

Rev

Rev 425 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
425 victor 1
$Revision: 431 $
431 serge 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;                                                              ;;
8
;;  QUEUE.INC                                                   ;;
9
;;                                                              ;;
10
;;  Buffer queue management for Menuet OS TCP/IP Stack          ;;
11
;;                                                              ;;
12
;;  Version 0.3  29 August 2002                                 ;;
13
;;                                                              ;;
14
;;  Copyright 2002 Mike Hibbett, mikeh@oceanfree.net            ;;
15
;;                                                              ;;
16
;;  See file COPYING for details                                ;;
17
;;                                                              ;;
18
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 19
 
20
 
21
;*******************************************************************
22
;   Interface
23
;
24
;       queueInit   Configures the queues to empty
25
;       dequeue     Removes a buffer pointer from a queue
26
;       queue       Inserts a buffer pointer into a queue
27
;       freeBuff    Adds the buffer pointer to the list of free buffers
28
;       queueSize   Returns the number of entries in a queue
29
;
30
;      The various defines for queue names can be found in stack.inc
31
;
32
;*******************************************************************
33
 
34
 
35
;***************************************************************************
36
;   Function
37
;      freeBuff
38
;
39
;   Description
40
;       Adds a buffer number to the beginning of the free list.
41
;       buffer number in eax  ( ms word zeroed )
42
;       all other registers preserved
43
;        This always works, so no error returned
44
;***************************************************************************
45
freeBuff:
46
    push    ebx
47
    push    ecx
48
    mov     ebx, EMPTY_QUEUE
49
    shl     ebx, 1
50
    add     ebx, queues
51
    cli     ; Ensure that another process does not interfer
52
    movzx   ecx, word [ebx]
53
    mov     [ebx], ax
54
    shl     eax, 1
55
    add     eax, queueList
56
    mov     [eax], cx
57
    sti
58
    pop     ecx
59
    pop     ebx
60
 
61
    ret
62
 
63
 
64
;***************************************************************************
65
;   Function
66
;      queueSize
67
;
68
;   Description
69
;       Counts the number of entries in a queue
70
;       queue number in ebx ( ms word zeroed )
71
;       Queue size returned in eax
72
;    This always works, so no error returned
73
;***************************************************************************
74
queueSize:
75
    xor     eax, eax
76
    shl     ebx, 1
77
    add     ebx, queues
78
    movzx   ecx, word [ebx]
79
    cmp     cx, NO_BUFFER
80
    je      qs_exit
81
 
82
qs_001:
83
    inc     eax
84
    shl     ecx, 1
85
    add     ecx, queueList
86
    movzx   ecx, word [ecx]
87
    cmp     cx, NO_BUFFER
88
    je      qs_exit
89
    jmp     qs_001
90
 
91
qs_exit:
92
    ret
93
 
94
 
95
;***************************************************************************
96
;   Function
97
;      queue
98
;
99
;   Description
100
;       Adds a buffer number to the *end* of a queue
101
;       This is quite quick because these queues will be short
102
;       queue number in eax ( ms word zeroed )
103
;       buffer number in ebx  ( ms word zeroed )
104
;       all other registers preserved
105
;        This always works, so no error returned
106
;***************************************************************************
107
queue:
108
    push    ebx
109
    shl     ebx, 1
110
    add     ebx, queueList        ; eax now holds address of queue entry
111
    mov     [ebx], word NO_BUFFER    ; This buffer will be the last
112
 
113
    cli
114
    shl     eax, 1
115
    add     eax, queues            ; eax now holds address of queue
116
    movzx   ebx, word [eax]
117
 
118
    cmp     bx, NO_BUFFER
119
    jne     qu_001
120
 
121
    pop     ebx
122
    ; The list is empty, so add this to the head
123
    mov     [eax], bx
124
    jmp     qu_exit
125
 
126
qu_001:
127
    ; Find the last entry
128
    shl     ebx, 1
129
    add     ebx, queueList
130
    mov     eax, ebx
131
    movzx   ebx, word [ebx]
132
    cmp     bx, NO_BUFFER
133
    jne     qu_001
134
 
135
    mov     ebx, eax
136
    pop     eax
137
    mov     [ebx], ax
138
 
139
qu_exit:
140
    sti
141
    ret
142
 
143
 
144
 
145
;***************************************************************************
146
;   Function
147
;      dequeue
148
;
149
;   Description
150
;       removes a buffer number from the head of a queue
151
;       This is fast, as it unlinks the first entry in the list
152
;       queue number in eax ( ms word zeroed )
153
;       buffer number returned in eax ( ms word zeroed )
154
;       all other registers preserved
155
;
156
;***************************************************************************
157
dequeue:
158
    push    ebx
159
    shl     eax, 1
160
    add     eax, queues            ; eax now holds address of queue
161
    mov     ebx, eax
162
    cli
163
    movzx   eax, word [eax]
164
    cmp     ax, NO_BUFFER
165
    je      dq_exit
166
    push    eax
167
    shl     eax, 1
168
    add     eax, queueList        ; eax now holds address of queue entry
169
    mov     ax, [eax]
170
    mov     [ebx], ax
171
    pop     eax
172
 
173
dq_exit:
174
    sti
175
    pop     ebx
176
    ret
177
 
178
 
179
;***************************************************************************
180
;   Function
181
;      queueInit
182
;
183
;   Description
184
;       Initialises the queues to empty, and creates the free queue
185
;       list.
186
;
187
;***************************************************************************
188
queueInit:
189
    mov     esi, queues
190
    mov     ecx, NUMQUEUES
191
    mov     ax, NO_BUFFER
192
 
193
qi001:
194
    mov     [esi], ax
195
    inc     esi
196
    inc     esi
197
    loop    qi001
198
 
199
    mov     esi, queues + ( 2 * EMPTY_QUEUE )
200
 
201
    ; Initialise empty queue list
202
 
203
    xor     ax, ax
204
    mov     [esi], ax
205
 
206
    mov     ecx, NUMQUEUEENTRIES - 1
207
    mov     esi, queueList
208
 
209
qi002:
210
    inc     ax
211
    mov     [esi], ax
212
    inc     esi
213
    inc     esi
214
    loop    qi002
215
 
216
    mov     ax, NO_BUFFER
217
    mov     [esi], ax
218
 
219
    ret