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 |
|
} |
|