Subversion Repositories Kolibri OS

Rev

Rev 3725 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3725 Rev 5201
Line 10... Line 10...
10
;;          GNU GENERAL PUBLIC LICENSE                          ;;
10
;;          GNU GENERAL PUBLIC LICENSE                          ;;
11
;;             Version 2, June 1991                             ;;
11
;;             Version 2, June 1991                             ;;
12
;;                                                              ;;
12
;;                                                              ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 14... Line 14...
14
 
14
 
Line 15... Line 15...
15
$Revision: 3725 $
15
$Revision: 5201 $
16
 
16
 
17
; The Queues implemented by these macros form a ring-buffer.
17
; The Queues implemented by these macros form a ring-buffer.
18
; The data to these queue's always looks like this:
18
; The data to these queue's always looks like this:
Line 26... Line 26...
26
struct  queue
26
struct  queue
Line 27... Line 27...
27
 
27
 
28
        size            dd ?    ; number of queued packets in this queue
28
        size            dd ?    ; number of queued packets in this queue
29
        w_ptr           dd ?    ; current writing pointer in queue
29
        w_ptr           dd ?    ; current writing pointer in queue
30
        r_ptr           dd ?    ; current reading pointer
-
 
Line 31... Line 30...
31
        mutex           MUTEX
30
        r_ptr           dd ?    ; current reading pointer
Line 32... Line 31...
32
 
31
 
Line 45... Line 44...
45
 
44
 
Line 46... Line 45...
46
macro add_to_queue ptr, size, entry_size, failaddr {
45
macro add_to_queue ptr, size, entry_size, failaddr {
Line 47... Line -...
47
 
-
 
48
local .ok, .no_wrap
-
 
49
 
46
 
50
        pusha
-
 
Line 51... Line 47...
51
        lea     ecx, [ptr + queue.mutex]
47
local .ok, .no_wrap
52
        call    mutex_lock
48
 
Line 53... Line -...
53
        popa
-
 
54
 
-
 
55
        cmp     [ptr + queue.size], size        ; Check if queue isnt full
49
        spin_lock_irqsave
56
        jb      .ok
-
 
57
 
50
 
Line 58... Line 51...
58
        pusha
51
        cmp     [ptr + queue.size], size        ; Check if queue isnt full
59
        lea     ecx, [ptr + queue.mutex]
52
        jb      .ok
Line 74... Line 67...
74
 
67
 
75
        sub     edi, size*entry_size
68
        sub     edi, size*entry_size
76
  .no_wrap:
69
  .no_wrap:
Line 77... Line -...
77
        mov     [ptr + queue.w_ptr], edi
-
 
78
 
-
 
79
        pusha
70
        mov     [ptr + queue.w_ptr], edi
80
        lea     ecx, [ptr + queue.mutex]
-
 
Line 81... Line 71...
81
        call    mutex_unlock
71
 
Line 82... Line 72...
82
        popa
72
        spin_unlock_irqrestore
Line 83... Line 73...
83
 
73
 
Line 84... Line -...
84
}
-
 
85
 
-
 
86
 
74
}
87
 
-
 
Line 88... Line 75...
88
macro get_from_queue ptr, size, entry_size,  failaddr {
75
 
89
 
76
 
Line 90... Line -...
90
local .ok, .no_wrap
-
 
91
 
-
 
92
        pusha
77
 
93
        lea     ecx, [ptr + queue.mutex]
-
 
94
        call    mutex_lock
78
macro get_from_queue ptr, size, entry_size,  failaddr {
Line 95... Line 79...
95
        popa
79
 
96
 
80
local .ok, .no_wrap
Line 120... Line 104...
120
  .no_wrap:
104
  .no_wrap:
121
        mov     dword [ptr + queue.r_ptr], esi
105
        mov     dword [ptr + queue.r_ptr], esi
Line 122... Line 106...
122
 
106
 
Line 123... Line -...
123
        pop     esi
-
 
124
 
-
 
125
        pusha
107
        pop     esi
126
        lea     ecx, [ptr + queue.mutex]
-
 
Line 127... Line 108...
127
        call    mutex_unlock
108
 
Line 128... Line 109...
128
        popa
109
        spin_unlock_irqrestore
Line 129... Line 110...
129
 
110
 
130
}
111
}
131
 
112
 
132
macro init_queue ptr {
113
macro init_queue ptr {
Line 133... Line -...
133
 
-
 
134
        mov     [ptr + queue.size] , 0
-
 
135
        lea     edi, [ptr + sizeof.queue]
114
 
136
        mov     [ptr + queue.w_ptr], edi
115
        mov     [ptr + queue.size] , 0