Rev 2164 | Rev 2288 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2164 | Rev 2167 | ||
---|---|---|---|
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: 2164 $ |
8 | $Revision: 2167 $ |
9 | 9 | ||
10 | 10 | ||
Line 44... | Line 44... | ||
44 | jna @f |
44 | jna @f |
45 | mov op, 63 |
45 | mov op, 63 |
46 | @@: |
46 | @@: |
47 | } |
47 | } |
Line -... | Line 48... | ||
- | 48 | ||
- | 49 | align 4 |
|
48 | 50 | md: |
|
- | 51 | .add_to_used: |
|
- | 52 | mov eax, [esi+block_base] |
|
- | 53 | mov ebx, [esi+block_base] |
|
- | 54 | shr ebx, 6 |
|
- | 55 | add eax, ebx |
|
- | 56 | shr ebx, 6 |
|
- | 57 | add eax, ebx |
|
- | 58 | shr eax, 12 |
|
- | 59 | and eax, 63 |
|
49 | macro remove_from_used op |
60 | inc [mem_hash_cnt+eax*4] |
- | 61 | ||
- | 62 | lea ecx, [mem_used_list+eax*8] |
|
- | 63 | list_add esi, ecx |
|
50 | { |
64 | mov [esi+block_flags], USED_BLOCK |
- | 65 | mov eax, [esi+block_size] |
|
- | 66 | sub [heap_free], eax |
|
- | 67 | ret |
|
- | 68 | align 4 |
|
51 | mov edx, [op+list_fd] |
69 | .find_used: |
52 | mov ecx, [op+list_bk] |
70 | mov ecx, eax |
- | 71 | mov ebx, eax |
|
- | 72 | shr ebx, 6 |
|
- | 73 | add ecx, ebx |
|
- | 74 | shr ebx, 6 |
|
- | 75 | add ecx, ebx |
|
- | 76 | shr ecx, 12 |
|
- | 77 | and ecx, 63 |
|
- | 78 | ||
53 | mov [edx+list_bk], ecx |
79 | lea ebx, [mem_used_list+ecx*8] |
- | 80 | mov esi, ebx |
|
54 | mov [ecx+list_fd], edx |
81 | .next: |
- | 82 | mov esi, [esi+list_fd] |
|
- | 83 | cmp esi, ebx |
|
- | 84 | je .fail |
|
55 | mov [op+list_fd], 0 |
85 | |
- | 86 | cmp eax, [esi+block_base] |
|
- | 87 | jne .next |
|
- | 88 | ||
- | 89 | ret |
|
- | 90 | .fail: |
|
- | 91 | xor esi, esi |
|
- | 92 | ret |
|
- | 93 | ||
- | 94 | align 4 |
|
- | 95 | .del_from_used: |
|
- | 96 | call .find_used |
|
- | 97 | test esi, esi |
|
- | 98 | jz .done |
|
- | 99 | ||
- | 100 | cmp [esi+block_flags], USED_BLOCK |
|
56 | mov [op+list_bk], 0 |
101 | jne .fatal |
- | 102 | ||
- | 103 | dec [mem_hash_cnt+ecx*4] |
|
- | 104 | list_del esi |
|
- | 105 | .done: |
|
- | 106 | ret |
|
- | 107 | .fatal: ;FIXME panic here |
|
- | 108 | xor esi, esi |
|
Line 57... | Line 109... | ||
57 | } |
109 | ret |
58 | 110 | ||
59 | ;Initial heap state |
111 | ;Initial heap state |
60 | ; |
112 | ; |
Line 72... | Line 124... | ||
72 | mov eax, edi |
124 | mov eax, edi |
73 | stosd |
125 | stosd |
74 | stosd |
126 | stosd |
75 | loop @B |
127 | loop @B |
Line 76... | Line 128... | ||
76 | 128 | ||
77 | mov eax, mem_used.fd |
129 | mov ecx, 64 |
- | 130 | mov edi, mem_used_list |
|
78 | mov [mem_used.fd], eax |
131 | @@: |
- | 132 | mov eax, edi |
|
- | 133 | stosd |
|
- | 134 | stosd |
|
Line 79... | Line 135... | ||
79 | mov [mem_used.bk], eax |
135 | loop @B |
80 | 136 | ||
81 | stdcall alloc_pages, dword 32 |
137 | stdcall alloc_pages, dword 32 |
82 | mov ecx, 32 |
138 | mov ecx, 32 |
Line 137... | Line 193... | ||
137 | add eax, MEM_BLOCK.sizeof |
193 | add eax, MEM_BLOCK.sizeof |
138 | loop @B |
194 | loop @B |
Line 139... | Line 195... | ||
139 | 195 | ||
Line 140... | Line -... | ||
140 | mov [eax-MEM_BLOCK.sizeof], dword 0 |
- | |
141 | 196 | mov [eax-MEM_BLOCK.sizeof], dword 0 |
|
142 | 197 | ||
143 | mov ecx, heap_mutex |
198 | mov ecx, heap_mutex |
144 | call mutex_init |
199 | call mutex_init |
145 | mov [heap_blocks], 4094 |
200 | mov [heap_blocks], 4094 |
Line 277... | Line 332... | ||
277 | sub [edi+block_size], edx |
332 | sub [edi+block_size], edx |
Line 278... | Line 333... | ||
278 | 333 | ||
279 | mov eax, [edi+block_size] |
334 | mov eax, [edi+block_size] |
280 | calc_index eax |
335 | calc_index eax |
281 | cmp eax, [block_ind] |
336 | cmp eax, [block_ind] |
Line 282... | Line 337... | ||
282 | je .m_eq_ind |
337 | je .add_used |
Line 283... | Line 338... | ||
283 | 338 | ||
284 | list_del edi |
339 | list_del edi |
Line 290... | Line 345... | ||
290 | btr [mem_block_mask], ecx |
345 | btr [mem_block_mask], ecx |
291 | @@: |
346 | @@: |
292 | bts [mem_block_mask], eax |
347 | bts [mem_block_mask], eax |
293 | lea edx, [mem_block_list+eax*8] ;edx= list head |
348 | lea edx, [mem_block_list+eax*8] ;edx= list head |
294 | list_add edi, edx |
349 | list_add edi, edx |
295 | .m_eq_ind: |
350 | .add_used: |
- | 351 | ||
296 | mov ecx, mem_used.fd |
352 | call md.add_to_used |
297 | mov edx, [ecx+list_fd] |
- | |
298 | mov [esi+list_fd], edx |
- | |
299 | mov [esi+list_bk], ecx |
- | |
300 | mov [ecx+list_fd], esi |
- | |
301 | mov [edx+list_bk], esi |
- | |
Line 302... | Line -... | ||
302 | - | ||
303 | mov [esi+block_flags], USED_BLOCK |
- | |
304 | mov ebx, [size] |
- | |
305 | sub [heap_free], ebx |
353 | |
306 | mov ecx, heap_mutex |
354 | mov ecx, heap_mutex |
307 | call mutex_unlock |
355 | call mutex_unlock |
308 | mov eax, [esi+block_base] |
356 | mov eax, [esi+block_base] |
309 | pop edi |
357 | pop edi |
310 | pop esi |
358 | pop esi |
311 | pop ebx |
359 | pop ebx |
- | 360 | ret |
|
312 | ret |
361 | |
313 | .m_eq_size: |
362 | .m_eq_size: |
314 | list_del edi |
363 | list_del edi |
315 | lea edx, [mem_block_list+ebx*8] |
364 | lea edx, [mem_block_list+ebx*8] |
316 | cmp edx, [edx] |
365 | cmp edx, [edx] |
317 | jnz @f |
366 | jnz @f |
318 | btr [mem_block_mask], ebx |
367 | btr [mem_block_mask], ebx |
319 | @@: |
- | |
320 | mov ecx, mem_used.fd |
- | |
321 | mov edx, [ecx+list_fd] |
- | |
322 | mov [edi+list_fd], edx |
- | |
323 | mov [edi+list_bk], ecx |
- | |
324 | mov [ecx+list_fd], edi |
- | |
325 | mov [edx+list_bk], edi |
- | |
326 | - | ||
327 | mov [edi+block_flags], USED_BLOCK |
368 | @@: |
328 | mov ebx, [size] |
- | |
329 | sub [heap_free], ebx |
- | |
330 | mov ecx, heap_mutex |
- | |
331 | call mutex_unlock |
- | |
332 | mov eax, [edi+block_base] |
- | |
333 | pop edi |
369 | mov esi, edi |
334 | pop esi |
- | |
335 | pop ebx |
- | |
Line 336... | Line 370... | ||
336 | ret |
370 | jmp .add_used |
337 | 371 | ||
338 | .error_unlock: |
372 | .error_unlock: |
339 | mov ecx, heap_mutex |
373 | mov ecx, heap_mutex |
Line 351... | Line 385... | ||
351 | 385 | ||
352 | mov ecx, heap_mutex |
386 | mov ecx, heap_mutex |
Line 353... | Line 387... | ||
353 | call mutex_lock |
387 | call mutex_lock |
354 | - | ||
355 | mov eax, [base] |
- | |
356 | mov esi, [mem_used.fd] |
- | |
357 | @@: |
- | |
Line 358... | Line -... | ||
358 | cmp esi, mem_used.fd |
- | |
359 | je .fail |
388 | |
360 | 389 | mov eax, [base] |
|
361 | cmp [esi+block_base], eax |
- | |
362 | je .found |
- | |
363 | mov esi, [esi+list_fd] |
- | |
364 | jmp @b |
390 | |
Line 365... | Line 391... | ||
365 | .found: |
391 | call md.del_from_used |
366 | cmp [esi+block_flags], USED_BLOCK |
392 | test esi, esi |
Line 367... | Line 393... | ||
367 | jne .fail |
393 | jz .fail |
Line 393... | Line 419... | ||
393 | .prev: |
419 | .prev: |
394 | mov edi, [esi+block_prev] |
420 | mov edi, [esi+block_prev] |
395 | cmp [edi+block_flags], FREE_BLOCK |
421 | cmp [edi+block_flags], FREE_BLOCK |
396 | jne .insert |
422 | jne .insert |
Line 397... | Line -... | ||
397 | - | ||
398 | remove_from_used esi |
- | |
399 | 423 | ||
400 | mov edx, [esi+block_next] |
424 | mov edx, [esi+block_next] |
401 | mov [edi+block_next], edx |
425 | mov [edi+block_next], edx |
Line 402... | Line 426... | ||
402 | mov [edx+block_prev], edi |
426 | mov [edx+block_prev], edi |
Line 431... | Line 455... | ||
431 | call mutex_unlock |
455 | call mutex_unlock |
432 | xor eax, eax |
456 | xor eax, eax |
433 | not eax |
457 | not eax |
434 | ret |
458 | ret |
435 | .insert: |
459 | .insert: |
436 | remove_from_used esi |
- | |
437 | mov [esi+block_flags], FREE_BLOCK |
460 | mov [esi+block_flags], FREE_BLOCK |
438 | mov eax, [esi+block_size] |
461 | mov eax, [esi+block_size] |
439 | calc_index eax |
462 | calc_index eax |
440 | mov edi, esi |
463 | mov edi, esi |
441 | jmp .add_block |
464 | jmp .add_block |
Line 521... | Line 544... | ||
521 | ret |
544 | ret |
522 | endp |
545 | endp |
Line 523... | Line 546... | ||
523 | 546 | ||
524 | align 4 |
547 | align 4 |
- | 548 | proc kernel_free stdcall, base:dword |
|
525 | proc kernel_free stdcall, base:dword |
549 | |
Line 526... | Line 550... | ||
526 | push ebx esi |
550 | push ebx esi |
527 | 551 | ||
Line 528... | Line 552... | ||
528 | mov ecx, heap_mutex |
552 | mov ecx, heap_mutex |
529 | call mutex_lock |
- | |
530 | - | ||
531 | mov eax, [base] |
553 | call mutex_lock |
532 | mov esi, [mem_used.fd] |
- | |
Line 533... | Line -... | ||
533 | @@: |
- | |
534 | cmp esi, mem_used.fd |
- | |
535 | je .fail |
554 | |
536 | - | ||
537 | cmp [esi+block_base], eax |
- | |
538 | je .found |
555 | mov eax, [base] |
539 | mov esi, [esi+list_fd] |
556 | call md.find_used |
Line 540... | Line 557... | ||
540 | jmp @b |
557 |