Rev 2129 | Rev 2164 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2129 | Rev 2154 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 2129 $ |
8 | $Revision: 2154 $ |
- | 9 | ||
- | 10 | ||
9 | 11 | struc MEM_BLOCK |
|
10 | 12 | { |
|
11 | struc MEM_BLOCK |
- | |
12 | { .next_block dd ? |
- | |
13 | .prev_block dd ? ;+4 |
13 | .list LHEAD |
14 | .list_fd dd ? ;+8 |
14 | .next_block dd ? ;+8 |
15 | .list_bk dd ? ;+12 |
15 | .prev_block dd ? ;+4 |
16 | .base dd ? ;+16 |
16 | .base dd ? ;+16 |
- | 17 | .size dd ? ;+20 |
|
17 | .size dd ? ;+20 |
18 | .flags dd ? ;+24 |
Line 18... | Line -... | ||
18 | .flags dd ? ;+24 |
- | |
19 | .handle dd ? ;+28 |
19 | .handle dd ? ;+28 |
20 | } |
20 | .sizeof: |
21 | 21 | } |
|
Line 22... | Line 22... | ||
22 | MEM_LIST_OFFSET equ 8 |
22 | |
23 | FREE_BLOCK equ 4 |
23 | FREE_BLOCK equ 4 |
24 | USED_BLOCK equ 8 |
24 | USED_BLOCK equ 8 |
Line 25... | Line -... | ||
25 | DONT_FREE_BLOCK equ 10h |
- | |
Line 26... | Line 25... | ||
26 | 25 | DONT_FREE_BLOCK equ 10h |
|
27 | virtual at 0 |
26 | |
28 | MEM_BLOCK MEM_BLOCK |
27 | virtual at 0 |
29 | end virtual |
28 | MEM_BLOCK MEM_BLOCK |
30 | 29 | end virtual |
|
31 | MEM_BLOCK_SIZE equ 8*4 |
30 | |
32 | 31 | ||
Line 33... | Line 32... | ||
33 | block_next equ MEM_BLOCK.next_block |
32 | block_next equ MEM_BLOCK.next_block |
Line 45... | Line 44... | ||
45 | jna @f |
44 | jna @f |
46 | mov op, 63 |
45 | mov op, 63 |
47 | @@: |
46 | @@: |
48 | } |
47 | } |
Line 49... | Line -... | ||
49 | - | ||
50 | macro remove_from_list op |
- | |
51 | { mov edx, [op+list_fd] |
- | |
52 | mov ecx, [op+list_bk] |
- | |
53 | test edx, edx |
- | |
54 | jz @f |
- | |
55 | mov [edx+list_bk], ecx |
- | |
56 | @@: |
- | |
57 | test ecx, ecx |
- | |
58 | jz @f |
- | |
59 | mov [ecx+list_fd], edx |
- | |
60 | @@: |
- | |
61 | mov [op+list_fd],0 |
- | |
62 | mov [op+list_bk],0 |
- | |
63 | } |
- | |
64 | - | ||
65 | macro remove_from_free op |
- | |
66 | { |
- | |
67 | remove_from_list op |
- | |
68 | - | ||
69 | mov eax, [op+block_size] |
- | |
70 | calc_index eax |
- | |
71 | cmp [mem_block_list+eax*4], op |
- | |
72 | jne @f |
- | |
73 | mov [mem_block_list+eax*4], edx |
- | |
74 | @@: |
- | |
75 | cmp [mem_block_list+eax*4], 0 |
- | |
76 | jne @f |
- | |
77 | btr [mem_block_mask], eax |
- | |
78 | @@: |
- | |
79 | } |
- | |
80 | 48 | ||
81 | macro remove_from_used op |
49 | macro remove_from_used op |
82 | { |
50 | { |
83 | mov edx, [op+list_fd] |
51 | mov edx, [op+list_fd] |
84 | mov ecx, [op+list_bk] |
52 | mov ecx, [op+list_bk] |
85 | mov [edx+list_bk], ecx |
53 | mov [edx+list_bk], ecx |
86 | mov [ecx+list_fd], edx |
54 | mov [ecx+list_fd], edx |
87 | mov [op+list_fd], 0 |
55 | mov [op+list_fd], 0 |
88 | mov [op+list_bk], 0 |
56 | mov [op+list_bk], 0 |
Line -... | Line 57... | ||
- | 57 | } |
|
- | 58 | ||
- | 59 | ;Initial heap state |
|
- | 60 | ; |
|
- | 61 | ;+heap_size terminator USED_BLOCK |
|
- | 62 | ;+4096*MEM_BLOCK.sizeof free space FREE_BLOCK |
|
- | 63 | ;HEAP_BASE heap_descriptors USED_BLOCK |
|
89 | } |
64 | ; |
90 | 65 | ||
Line 91... | Line 66... | ||
91 | align 4 |
66 | align 4 |
92 | proc init_kernel_heap |
67 | proc init_kernel_heap |
93 | - | ||
94 | mov ecx, 64 |
- | |
95 | mov edi, mem_block_list |
- | |
96 | xor eax, eax |
68 | |
97 | cld |
69 | mov ecx, 64 |
98 | rep stosd |
- | |
99 | 70 | mov edi, mem_block_list |
|
100 | mov ecx, 512/4 |
71 | @@: |
101 | mov edi, mem_block_map |
- | |
102 | not eax |
- | |
103 | rep stosd |
- | |
104 | 72 | mov eax, edi |
|
Line 105... | Line 73... | ||
105 | mov [mem_block_start], mem_block_map |
73 | stosd |
106 | mov [mem_block_end], mem_block_map+512 |
74 | stosd |
107 | mov [mem_block_arr], HEAP_BASE |
75 | loop @B |
Line 108... | Line 76... | ||
108 | 76 | ||
109 | mov eax, mem_used.fd-MEM_LIST_OFFSET |
77 | mov eax, mem_used.fd |
Line 119... | Line 87... | ||
119 | add edi, 0x1000 |
87 | add edi, 0x1000 |
120 | add edx, 0x1000 |
88 | add edx, 0x1000 |
121 | dec ecx |
89 | dec ecx |
122 | jnz .l1 |
90 | jnz .l1 |
Line 123... | Line 91... | ||
123 | 91 | ||
124 | mov edi, HEAP_BASE |
92 | mov edi, HEAP_BASE ;descriptors |
- | 93 | mov ebx, HEAP_BASE+MEM_BLOCK.sizeof ;free space |
|
- | 94 | mov ecx, HEAP_BASE+MEM_BLOCK.sizeof*2 ;terminator |
|
125 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE |
95 | |
126 | xor eax, eax |
96 | xor eax, eax |
127 | mov [edi+block_next], ebx |
97 | mov [edi+block_next], ebx |
128 | mov [edi+block_prev], eax |
98 | mov [edi+block_prev], eax |
129 | mov [edi+list_fd], eax |
99 | mov [edi+list_fd], eax |
130 | mov [edi+list_bk], eax |
100 | mov [edi+list_bk], eax |
131 | mov [edi+block_base], HEAP_BASE |
101 | mov [edi+block_base], HEAP_BASE |
- | 102 | mov [edi+block_size], 4096*MEM_BLOCK.sizeof |
|
- | 103 | mov [edi+block_flags], USED_BLOCK |
|
- | 104 | ||
- | 105 | mov [ecx+block_next], eax |
|
- | 106 | mov [ecx+block_prev], ebx |
|
- | 107 | mov [edi+list_fd], eax |
|
- | 108 | mov [edi+list_bk], eax |
|
- | 109 | mov [edi+block_base], eax |
|
132 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
110 | mov [edi+block_size], eax |
Line 133... | Line 111... | ||
133 | mov [edi+block_flags], USED_BLOCK |
111 | mov [edi+block_flags], USED_BLOCK |
134 | 112 | ||
135 | mov [ebx+block_next], eax |
- | |
136 | mov [ebx+block_prev], eax |
- | |
137 | mov [ebx+list_fd], eax |
113 | mov [ebx+block_next], ecx |
Line 138... | Line 114... | ||
138 | mov [ebx+list_bk], eax |
114 | mov [ebx+block_prev], edi |
139 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE |
115 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK.sizeof |
140 | 116 | ||
141 | mov ecx, [pg_data.kernel_pages] |
117 | mov ecx, [pg_data.kernel_pages] |
142 | shl ecx, 12 |
118 | shl ecx, 12 |
143 | sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK_SIZE |
119 | sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK.sizeof |
144 | mov [heap_size], ecx |
120 | mov [heap_size], ecx |
Line 145... | Line 121... | ||
145 | mov [heap_free], ecx |
121 | mov [heap_free], ecx |
146 | mov [ebx+block_size], ecx |
122 | mov [ebx+block_size], ecx |
Line 147... | Line 123... | ||
147 | mov [ebx+block_flags], FREE_BLOCK |
123 | mov [ebx+block_flags], FREE_BLOCK |
- | 124 | ||
- | 125 | mov [mem_block_mask], eax |
|
- | 126 | mov [mem_block_mask+4],0x80000000 |
|
- | 127 | ||
- | 128 | mov ecx, mem_block_list+63*8 |
|
- | 129 | list_add ebx, ecx |
|
- | 130 | ||
148 | 131 | mov ecx, 4096-3-1 |
|
- | 132 | mov eax, HEAP_BASE+MEM_BLOCK.sizeof*4 |
|
- | 133 | ||
- | 134 | mov [next_memblock], HEAP_BASE+MEM_BLOCK.sizeof*3 |
|
- | 135 | @@: |
|
- | 136 | mov [eax-MEM_BLOCK.sizeof], eax |
|
- | 137 | add eax, MEM_BLOCK.sizeof |
|
149 | mov [mem_block_mask], eax |
138 | loop @B |
150 | mov [mem_block_mask+4],0x80000000 |
139 | |
151 | 140 | mov [eax-MEM_BLOCK.sizeof], dword 0 |
|
152 | mov [mem_block_list+63*4], ebx |
141 | |
153 | mov byte [mem_block_map], 0xFC |
142 | |
154 | mov ecx, heap_mutex |
143 | mov ecx, heap_mutex |
Line 155... | Line 144... | ||
155 | call mutex_init |
144 | call mutex_init |
156 | mov [heap_blocks], 4095 |
145 | mov [heap_blocks], 4094 |
Line 189... | Line 178... | ||
189 | and edx, [esi] |
178 | and edx, [esi] |
190 | .find: |
179 | .find: |
191 | bsf edi, edx |
180 | bsf edi, edx |
192 | jz .high_mask |
181 | jz .high_mask |
193 | add ebx, edi |
182 | add ebx, edi |
194 | mov edi, [mem_block_list+ebx*4] |
183 | lea ecx, [mem_block_list+ebx*8] |
- | 184 | mov edi, ecx |
|
195 | .check_size: |
185 | .next: |
- | 186 | mov edi, [edi+list_fd] |
|
- | 187 | cmp edi, ecx |
|
- | 188 | je .err |
|
196 | cmp eax, [edi+block_size] |
189 | cmp eax, [edi+block_size] |
197 | ja .next |
190 | ja .next |
198 | ret |
191 | ret |
- | 192 | .err: |
|
- | 193 | xor edi, edi |
|
- | 194 | ret |
|
Line 199... | Line 195... | ||
199 | 195 | ||
200 | .high_mask: |
196 | .high_mask: |
201 | add esi, 4 |
197 | add esi, 4 |
202 | cmp esi, mem_block_mask+8 |
198 | cmp esi, mem_block_mask+8 |
203 | jae .err |
199 | jae .err |
204 | add ebx, 32 |
200 | add ebx, 32 |
205 | mov edx, [esi] |
201 | mov edx, [esi] |
206 | jmp .find |
- | |
207 | .next: |
- | |
208 | mov edi, [edi+list_fd] |
- | |
209 | test edi, edi |
- | |
210 | jnz .check_size |
- | |
211 | .err: |
- | |
212 | xor edi, edi |
- | |
213 | ret |
- | |
214 | - | ||
215 | align 4 |
- | |
Line 216... | Line -... | ||
216 | alloc_mem_block: |
- | |
217 | - | ||
218 | mov ebx, [mem_block_start] |
- | |
219 | mov ecx, [mem_block_end] |
- | |
220 | .l1: |
- | |
221 | bsf eax,[ebx]; |
- | |
222 | jnz found |
- | |
223 | add ebx,4 |
- | |
224 | cmp ebx, ecx |
- | |
225 | jb .l1 |
- | |
Line 226... | Line -... | ||
226 | xor eax,eax |
- | |
227 | ret |
- | |
228 | - | ||
229 | found: |
- | |
230 | btr [ebx], eax |
- | |
231 | mov [mem_block_start],ebx |
- | |
232 | sub ebx, mem_block_map |
- | |
233 | lea eax,[eax+ebx*8] |
- | |
234 | shl eax, 5 |
- | |
235 | add eax, [mem_block_arr] |
202 | jmp .find |
236 | dec [free_blocks] |
203 | |
237 | ret |
- | |
238 | align 4 |
204 | |
239 | free_mem_block: |
205 | align 4 |
240 | mov dword [eax], 0 |
- | |
241 | mov dword [eax+4], 0 |
- | |
242 | mov dword [eax+8], 0 |
- | |
243 | mov dword [eax+12], 0 |
- | |
244 | mov dword [eax+16], 0 |
- | |
245 | ; mov dword [eax+20], 0 |
- | |
246 | mov dword [eax+24], 0 |
206 | free_mem_block: |
247 | mov dword [eax+28], 0 |
207 | mov ebx, [next_memblock] |
Line 248... | Line 208... | ||
248 | 208 | mov [eax], ebx |
|
249 | sub eax, [mem_block_arr] |
209 | mov [next_memblock], eax |
- | 210 | xor ebx, ebx |
|
- | 211 | ||
- | 212 | mov dword [eax+4], ebx |
|
- | 213 | mov dword [eax+8], ebx |
|
- | 214 | mov dword [eax+12], ebx |
|
250 | shr eax, 5 |
215 | mov dword [eax+16], ebx |
251 | - | ||
252 | mov ebx, mem_block_map |
- | |
253 | bts [ebx], eax |
- | |
254 | inc [free_blocks] |
- | |
255 | shr eax, 3 |
- | |
256 | and eax, not 3 |
- | |
257 | add eax, ebx |
- | |
258 | cmp [mem_block_start], eax |
- | |
259 | ja @f |
- | |
260 | ret |
- | |
261 | @@: |
- | |
262 | mov [mem_block_start], eax |
216 | ; mov dword [eax+20], 0 ;don't clear block size |
Line 263... | Line 217... | ||
263 | ret |
217 | mov dword [eax+24], ebx |
264 | .err: |
218 | mov dword [eax+28], ebx |
265 | xor eax, eax |
219 | inc [free_blocks] |
Line 266... | Line 220... | ||
266 | ret |
220 | ret |
267 | 221 | ||
268 | align 4 |
222 | align 4 |
Line 269... | Line -... | ||
269 | proc alloc_kernel_space stdcall, size:dword |
- | |
270 | local block_ind:DWORD |
- | |
271 | - | ||
272 | push ebx |
223 | proc alloc_kernel_space stdcall, size:dword |
273 | push esi |
224 | local block_ind:DWORD |
274 | push edi |
225 | |
275 | 226 | push ebx |
|
Line 276... | Line 227... | ||
276 | mov ecx, heap_mutex |
227 | push esi |
277 | call mutex_lock |
228 | push edi |
Line -... | Line 229... | ||
- | 229 | ||
- | 230 | mov eax, [size] |
|
- | 231 | add eax, 4095 |
|
- | 232 | and eax, not 4095 |
|
- | 233 | mov [size], eax |
|
278 | 234 | ||
279 | mov eax, [size] |
235 | cmp eax, [heap_free] |
280 | add eax, 4095 |
236 | ja .error |
Line 281... | Line 237... | ||
281 | and eax, not 4095 |
237 | |
282 | mov [size], eax |
238 | mov ecx, heap_mutex |
Line 283... | Line 239... | ||
283 | 239 | call mutex_lock |
|
Line 284... | Line 240... | ||
284 | cmp eax, [heap_free] |
240 | |
285 | ja .error |
241 | mov eax, [size] |
286 | 242 | ||
Line 287... | Line 243... | ||
287 | call get_small_block ; eax |
243 | call get_small_block ; eax |
288 | test edi, edi |
244 | test edi, edi |
289 | jz .error |
245 | jz .error_unlock |
Line -... | Line 246... | ||
- | 246 | ||
- | 247 | cmp [edi+block_flags], FREE_BLOCK |
|
290 | 248 | jne .error_unlock |
|
Line 291... | Line 249... | ||
291 | cmp [edi+block_flags], FREE_BLOCK |
249 | |
292 | jne .error |
250 | mov [block_ind], ebx ;index of allocated block |
293 | 251 | ||
294 | mov [block_ind], ebx ;index of allocated block |
252 | mov eax, [edi+block_size] |
295 | 253 | cmp eax, [size] |
|
296 | mov eax, [edi+block_size] |
254 | je .m_eq_size |
297 | cmp eax, [size] |
- | |
298 | je .m_eq_size |
- | |
299 | 255 | ||
300 | call alloc_mem_block |
256 | mov esi, [next_memblock] ;new memory block |
301 | and eax, eax |
257 | test esi, esi |
302 | jz .error |
258 | jz .error_unlock |
303 | 259 | ||
304 | mov esi, eax ;esi - splitted block |
260 | dec [free_blocks] |
305 | 261 | mov eax, [esi] |
|
306 | mov [esi+block_next], edi |
262 | mov [next_memblock], eax |
Line 307... | Line 263... | ||
307 | mov eax, [edi+block_prev] |
263 | |
308 | mov [esi+block_prev], eax |
- | |
309 | mov [edi+block_prev], esi |
- | |
310 | mov [esi+list_fd], 0 |
264 | mov [esi+block_next], edi |
311 | mov [esi+list_bk], 0 |
- | |
312 | and eax, eax |
- | |
313 | jz @f |
- | |
314 | mov [eax+block_next], esi |
265 | mov eax, [edi+block_prev] |
315 | @@: |
266 | mov [esi+block_prev], eax |
Line 316... | Line 267... | ||
316 | mov ebx, [edi+block_base] |
267 | mov [edi+block_prev], esi |
Line 317... | Line 268... | ||
317 | mov [esi+block_base], ebx |
268 | mov [esi+list_fd], 0 |
318 | mov edx, [size] |
269 | mov [esi+list_bk], 0 |
319 | mov [esi+block_size], edx |
- | |
320 | add [edi+block_base], edx |
270 | mov [eax+block_next], esi |
321 | sub [edi+block_size], edx |
271 | |
322 | 272 | mov ebx, [edi+block_base] |
|
323 | mov eax, [edi+block_size] |
273 | mov [esi+block_base], ebx |
324 | shr eax, 12 |
- | |
325 | sub eax, 1 |
- | |
326 | cmp eax, 63 |
- | |
327 | jna @f |
- | |
328 | mov eax, 63 |
- | |
329 | @@: |
- | |
330 | cmp eax, [block_ind] |
- | |
331 | je .m_eq_ind |
274 | mov edx, [size] |
- | 275 | mov [esi+block_size], edx |
|
- | 276 | add [edi+block_base], edx |
|
332 | 277 | sub [edi+block_size], edx |
|
333 | remove_from_list edi |
278 | |
334 | 279 | mov eax, [edi+block_size] |
|
335 | mov ecx, [block_ind] |
280 | calc_index eax |
336 | mov [mem_block_list+ecx*4], edx |
281 | cmp eax, [block_ind] |
337 | 282 | je .m_eq_ind |
|
338 | test edx, edx |
283 | |
Line 364... | Line 309... | ||
364 | pop edi |
309 | pop edi |
365 | pop esi |
310 | pop esi |
366 | pop ebx |
311 | pop ebx |
367 | ret |
312 | ret |
368 | .m_eq_size: |
313 | .m_eq_size: |
369 | remove_from_list edi |
314 | list_del edi |
370 | mov [mem_block_list+ebx*4], edx |
315 | lea edx, [mem_block_list+ebx*8] |
371 | and edx, edx |
316 | cmp edx, [edx] |
372 | jnz @f |
317 | jnz @f |
373 | btr [mem_block_mask], ebx |
318 | btr [mem_block_mask], ebx |
374 | @@: |
319 | @@: |
375 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
320 | mov ecx, mem_used.fd |
376 | mov edx, [ecx+list_fd] |
321 | mov edx, [ecx+list_fd] |
377 | mov [edi+list_fd], edx |
322 | mov [edi+list_fd], edx |
378 | mov [edi+list_bk], ecx |
323 | mov [edi+list_bk], ecx |
379 | mov [ecx+list_fd], edi |
324 | mov [ecx+list_fd], edi |
380 | mov [edx+list_bk], edi |
325 | mov [edx+list_bk], edi |
Line 387... | Line 332... | ||
387 | mov eax, [edi+block_base] |
332 | mov eax, [edi+block_base] |
388 | pop edi |
333 | pop edi |
389 | pop esi |
334 | pop esi |
390 | pop ebx |
335 | pop ebx |
391 | ret |
336 | ret |
- | 337 | ||
392 | .error: |
338 | .error_unlock: |
393 | mov ecx, heap_mutex |
339 | mov ecx, heap_mutex |
394 | call mutex_unlock |
340 | call mutex_unlock |
- | 341 | .error: |
|
395 | xor eax, eax |
342 | xor eax, eax |
396 | pop edi |
343 | pop edi |
397 | pop esi |
344 | pop esi |
398 | pop ebx |
345 | pop ebx |
399 | ret |
346 | ret |
400 | endp |
347 | endp |
Line 401... | Line 348... | ||
401 | 348 | ||
402 | align 4 |
349 | align 4 |
403 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
- | |
404 | push ebx |
- | |
405 | push esi |
- | |
Line 406... | Line 350... | ||
406 | push edi |
350 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
407 | 351 | ||
Line 408... | Line 352... | ||
408 | mov ecx, heap_mutex |
352 | mov ecx, heap_mutex |
409 | call mutex_lock |
353 | call mutex_lock |
410 | 354 | ||
411 | mov eax, [base] |
355 | mov eax, [base] |
412 | mov esi, [mem_used.fd] |
356 | mov esi, [mem_used.fd] |
Line 413... | Line 357... | ||
413 | @@: |
357 | @@: |
414 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
358 | cmp esi, mem_used.fd |
415 | je .fail |
359 | je .fail |
Line 424... | Line 368... | ||
424 | 368 | ||
425 | mov eax, [esi+block_size] |
369 | mov eax, [esi+block_size] |
Line 426... | Line 370... | ||
426 | add [heap_free], eax |
370 | add [heap_free], eax |
427 | - | ||
428 | mov edi, [esi+block_next] |
- | |
429 | test edi, edi |
- | |
430 | jz .prev |
371 | |
431 | 372 | mov edi, [esi+block_next] |
|
Line 432... | Line 373... | ||
432 | cmp [edi+block_flags], FREE_BLOCK |
373 | cmp [edi+block_flags], FREE_BLOCK |
Line 433... | Line 374... | ||
433 | jne .prev |
374 | jne .prev |
434 | 375 | ||
435 | remove_from_free edi |
- | |
436 | - | ||
437 | mov edx, [edi+block_next] |
- | |
438 | mov [esi+block_next], edx |
376 | list_del edi |
439 | test edx, edx |
- | |
440 | jz @f |
377 | |
441 | 378 | mov edx, [edi+block_next] |
|
Line -... | Line 379... | ||
- | 379 | mov [esi+block_next], edx |
|
- | 380 | mov [edx+block_prev], esi |
|
- | 381 | mov ecx, [edi+block_size] |
|
- | 382 | add [esi+block_size], ecx |
|
- | 383 | ||
- | 384 | calc_index ecx |
|
- | 385 | ||
442 | mov [edx+block_prev], esi |
386 | lea edx, [mem_block_list+ecx*8] |
443 | @@: |
387 | cmp edx, [edx] |
444 | mov ecx, [edi+block_size] |
388 | jne @F |
445 | add [esi+block_size], ecx |
389 | btr [mem_block_mask], ecx |
446 | - | ||
447 | mov eax, edi |
- | |
448 | call free_mem_block |
- | |
449 | .prev: |
390 | @@: |
450 | mov edi, [esi+block_prev] |
391 | mov eax, edi |
Line 451... | Line 392... | ||
451 | test edi, edi |
392 | call free_mem_block |
Line 452... | Line 393... | ||
452 | jz .insert |
393 | .prev: |
453 | 394 | mov edi, [esi+block_prev] |
|
454 | cmp [edi+block_flags], FREE_BLOCK |
- | |
455 | jne .insert |
- | |
456 | 395 | cmp [edi+block_flags], FREE_BLOCK |
|
457 | remove_from_used esi |
396 | jne .insert |
458 | 397 | ||
459 | mov edx, [esi+block_next] |
398 | remove_from_used esi |
Line 460... | Line 399... | ||
460 | mov [edi+block_next], edx |
399 | |
461 | test edx, edx |
400 | mov edx, [esi+block_next] |
462 | jz @f |
401 | mov [edi+block_next], edx |
463 | mov [edx+block_prev], edi |
402 | mov [edx+block_prev], edi |
Line 464... | Line 403... | ||
464 | @@: |
403 | |
465 | mov eax, esi |
404 | mov eax, esi |
466 | call free_mem_block |
405 | call free_mem_block |
467 | 406 | ||
Line 468... | Line 407... | ||
468 | mov ecx, [edi+block_size] |
407 | mov ecx, [edi+block_size] |
469 | mov eax, [esi+block_size] |
408 | mov eax, [esi+block_size] |
470 | add eax, ecx |
409 | add eax, ecx |
Line 471... | Line 410... | ||
471 | mov [edi+block_size], eax |
410 | mov [edi+block_size], eax |
472 | 411 | ||
473 | calc_index eax |
- | |
474 | calc_index ecx |
- | |
475 | cmp eax, ecx |
- | |
476 | je .m_eq |
412 | calc_index eax ;new index |
477 | 413 | calc_index ecx ;old index |
|
478 | push ecx |
- | |
479 | remove_from_list edi |
- | |
480 | pop ecx |
- | |
481 | - | ||
482 | cmp [mem_block_list+ecx*4], edi |
- | |
483 | jne @f |
414 | cmp eax, ecx |
484 | mov [mem_block_list+ecx*4], edx |
- | |
485 | @@: |
- | |
486 | cmp [mem_block_list+ecx*4], 0 |
415 | je .m_eq |
- | 416 | ||
- | 417 | push ecx |
|
487 | jne @f |
418 | list_del edi |
488 | btr [mem_block_mask], ecx |
419 | pop ecx |
489 | @@: |
420 | |
490 | mov esi, [mem_block_list+eax*4] |
421 | lea edx, [mem_block_list+ecx*8] |
491 | mov [mem_block_list+eax*4], edi |
422 | cmp edx, [edx] |
492 | mov [edi+list_fd], esi |
- | |
493 | test esi, esi |
- | |
494 | jz @f |
- | |
495 | mov [esi+list_bk], edi |
423 | jne .add_block |
496 | @@: |
424 | btr [mem_block_mask], ecx |
497 | bts [mem_block_mask], eax |
425 | .add_block: |
498 | .m_eq: |
- | |
- | 426 | bts [mem_block_mask], eax |
|
499 | mov ecx, heap_mutex |
427 | lea edx, [mem_block_list+eax*8] |
500 | call mutex_unlock |
428 | list_add edi, edx |
- | 429 | .m_eq: |
|
- | 430 | mov ecx, heap_mutex |
|
Line 501... | Line -... | ||
501 | xor eax, eax |
- | |
502 | not eax |
- | |
503 | pop edi |
- | |
504 | pop esi |
- | |
505 | pop ebx |
- | |
506 | ret |
- | |
507 | .insert: |
- | |
508 | remove_from_used esi |
- | |
509 | - | ||
510 | mov eax, [esi+block_size] |
- | |
511 | calc_index eax |
- | |
512 | - | ||
513 | mov edi, [mem_block_list+eax*4] |
- | |
514 | mov [mem_block_list+eax*4], esi |
- | |
515 | mov [esi+list_fd], edi |
- | |
516 | test edi, edi |
- | |
517 | jz @f |
- | |
518 | mov [edi+list_bk], esi |
431 | call mutex_unlock |
519 | @@: |
432 | xor eax, eax |
520 | bts [mem_block_mask], eax |
433 | not eax |
521 | mov [esi+block_flags],FREE_BLOCK |
434 | ret |
522 | mov ecx, heap_mutex |
- | |
523 | call mutex_unlock |
- | |
524 | xor eax, eax |
- | |
525 | not eax |
435 | .insert: |
526 | pop edi |
436 | remove_from_used esi |
Line 527... | Line 437... | ||
527 | pop esi |
437 | mov [esi+block_flags], FREE_BLOCK |
528 | pop ebx |
438 | mov eax, [esi+block_size] |
Line 619... | Line 529... | ||
619 | call mutex_lock |
529 | call mutex_lock |
Line 620... | Line 530... | ||
620 | 530 | ||
621 | mov eax, [base] |
531 | mov eax, [base] |
622 | mov esi, [mem_used.fd] |
532 | mov esi, [mem_used.fd] |
623 | @@: |
533 | @@: |
624 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
534 | cmp esi, mem_used.fd |
Line 625... | Line 535... | ||
625 | je .fail |
535 | je .fail |
626 | 536 | ||
627 | cmp [esi+block_base], eax |
537 | cmp [esi+block_base], eax |