Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1158 → Rev 1159

/kernel/branches/network/queue.inc
0,0 → 1,102
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; queue.inc ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 983 $
 
struct queue
.size dd ?
.w_ptr dd ?
.r_ptr dd ?
.data:
ends
 
struct queue_entry
.owner dd ?
.data_ptr dd ?
.data_size dd ?
.size:
ends
 
 
macro add_to_queue ptr, size, returnaddr {
 
cmp dword [ptr + queue.size], size ; Check if queue isnt full
jge .fail
 
DEBUGF 1,"Queuing packet for device %x\n",ebx
 
inc dword [ptr + queue.size]
 
mov edi, dword [ptr + queue.w_ptr] ; Current write pointer (FIFO!)
 
mov eax, ebx
stosd
pop eax
stosd
pop eax
stosd
 
cmp edi, size*queue_entry.size+ptr+queue.data ; entry size
jl .no_wrap
 
sub edi, size*queue_entry.size
 
.no_wrap:
mov dword [ptr + queue.w_ptr], edi
jmp returnaddr
 
.fail:
DEBUGF 1,"queuing failed\n"
 
call kernel_free
add esp, 4
ret
 
}
 
 
macro get_from_queue ptr, size, returnaddr {
 
.start_of_code:
cmp dword [ptr + queue.size], 0 ; any packets queued?
je returnaddr
 
DEBUGF 1,"Dequeuing packet"
 
dec dword [ptr + queue.size]
 
push dword .start_of_code ; return address for call's
 
mov esi, [ptr + queue.r_ptr]
lodsd
mov ebx, eax
lodsd
mov ecx, eax
lodsd
push eax
push ecx
xchg eax, ecx
 
DEBUGF 1," for device %x\n", ebx
 
cmp esi, size*queue_entry.size+ptr+queue.data ; entry size
jl .no_wrap
 
sub esi, size*queue_entry.size
 
.no_wrap:
mov dword [ptr + queue.r_ptr], esi
 
}