Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3555 Serge 3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
3555 Serge 6
;;  queue.inc                                                   ;;
431 serge 7
;;                                                              ;;
3555 Serge 8
;;    Written by hidnplayr@kolibrios.org                        ;;
431 serge 9
;;                                                              ;;
3555 Serge 10
;;          GNU GENERAL PUBLIC LICENSE                          ;;
11
;;             Version 2, June 1991                             ;;
431 serge 12
;;                                                              ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 14
 
593 mikedld 15
$Revision: 3555 $
1 ha 16
 
3555 Serge 17
; The Queues implemented by these macros form a ring-buffer.
18
; The data to these queue's always looks like this:
1 ha 19
;
3555 Serge 20
; At top, you have the queue struct, wich has the size (number of currently queued packets, read and write pointers.
21
; This struct is followed by a number of slots wich you can read and write to using the macros.
22
; How these slots look like is up to you to chose, normally they should have at least a pointer to where the real data is.
23
; (you can see some examples below)
1 ha 24
 
25
 
3555 Serge 26
struct	queue
1 ha 27
 
3555 Serge 28
	size	       dd ?    ; number of queued packets in this queue
29
	w_ptr	       dd ?    ; current writing pointer in queue
30
	r_ptr	       dd ?    ; current reading pointer
1 ha 31
 
3555 Serge 32
ends
1 ha 33
 
3555 Serge 34
; The following macros share these inputs:
1 ha 35
 
3555 Serge 36
; ptr           = pointer to where the queue data is located
37
; size          = number of slots/entrys in the queue
38
; entry_size    = size of one slot, in bytes
39
; failaddr      = the address where macro will jump to when there is no data in the queue
1 ha 40
 
3555 Serge 41
; additionally, add_to_queue requires you to set esi to the data wich you want to queue
42
; get_from_queue on the other hand will return a pointer in esi, to the entry you're interessed in
43
; PS: macros WILL destroy ecx and edi
1 ha 44
 
3555 Serge 45
macro add_to_queue ptr, size, entry_size, failaddr {
1 ha 46
 
3555 Serge 47
	cmp	[ptr + queue.size], size	; Check if queue isnt full
48
	jae	failaddr
1 ha 49
 
3555 Serge 50
	inc	[ptr + queue.size]		; if not full, queue one more
1 ha 51
 
3555 Serge 52
	mov	edi, [ptr + queue.w_ptr]	; Current write pointer (FIFO!)
53
	mov	ecx, entry_size/4		; Write the queue entry
54
	rep	movsd				;
1 ha 55
 
3555 Serge 56
	lea	ecx, [size*entry_size+ptr+sizeof.queue]
57
	cmp	edi, ecx			; entry size
58
	jb	.no_wrap
1 ha 59
 
3555 Serge 60
	sub	edi, size*entry_size
1 ha 61
 
3555 Serge 62
  .no_wrap:
63
	mov	[ptr + queue.w_ptr], edi
1 ha 64
 
3555 Serge 65
}
1 ha 66
 
67
 
68
 
3555 Serge 69
macro get_from_queue ptr, size, entry_size,  failaddr {
1 ha 70
 
3555 Serge 71
	cmp	[ptr + queue.size], 0		; any packets queued?
72
	je	failaddr
1 ha 73
 
3555 Serge 74
	dec	[ptr + queue.size]		; if so, dequeue one
1 ha 75
 
3555 Serge 76
	mov	esi, [ptr + queue.r_ptr]
77
	push	esi
1 ha 78
 
3555 Serge 79
	add	esi, entry_size
1 ha 80
 
3555 Serge 81
	lea	ecx, [size*entry_size+ptr+sizeof.queue]
82
	cmp	esi, ecx			; entry size
83
	jb	.no_wrap
1 ha 84
 
3555 Serge 85
	sub	esi, size*entry_size
1 ha 86
 
3555 Serge 87
  .no_wrap:
88
	mov	dword [ptr + queue.r_ptr], esi
1 ha 89
 
3555 Serge 90
	pop	esi
1 ha 91
 
3555 Serge 92
}
1 ha 93
 
3555 Serge 94
macro init_queue ptr {
1 ha 95
 
3555 Serge 96
	mov	[ptr + queue.size] , 0
97
	lea	edi, [ptr + sizeof.queue]
98
	mov	[ptr + queue.w_ptr], edi
99
	mov	[ptr + queue.r_ptr], edi
100
}