Subversion Repositories Kolibri OS

Rev

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