28,6 → 28,7 |
size dd ? ; number of queued packets in this queue |
w_ptr dd ? ; current writing pointer in queue |
r_ptr dd ? ; current reading pointer |
mutex MUTEX |
|
ends |
|
44,9 → 45,23 |
|
macro add_to_queue ptr, size, entry_size, failaddr { |
|
local .ok, .no_wrap |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_lock |
popa |
|
cmp [ptr + queue.size], size ; Check if queue isnt full |
jae failaddr |
jb .ok |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_unlock |
popa |
jmp failaddr |
|
.ok: |
inc [ptr + queue.size] ; if not full, queue one more |
|
mov edi, [ptr + queue.w_ptr] ; Current write pointer (FIFO!) |
58,10 → 73,14 |
jb .no_wrap |
|
sub edi, size*entry_size |
|
.no_wrap: |
mov [ptr + queue.w_ptr], edi |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_unlock |
popa |
|
} |
|
|
68,9 → 87,23 |
|
macro get_from_queue ptr, size, entry_size, failaddr { |
|
local .ok, .no_wrap |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_lock |
popa |
|
cmp [ptr + queue.size], 0 ; any packets queued? |
je failaddr |
ja .ok |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_unlock |
popa |
jmp failaddr |
|
.ok: |
dec [ptr + queue.size] ; if so, dequeue one |
|
mov esi, [ptr + queue.r_ptr] |
89,6 → 122,11 |
|
pop esi |
|
pusha |
lea ecx, [ptr + queue.mutex] |
call mutex_unlock |
popa |
|
} |
|
macro init_queue ptr { |
97,4 → 135,7 |
lea edi, [ptr + sizeof.queue] |
mov [ptr + queue.w_ptr], edi |
mov [ptr + queue.r_ptr], edi |
|
lea ecx, [ptr + queue.mutex] |
call mutex_init |
} |