Subversion Repositories Kolibri OS

Rev

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

Rev 2130 Rev 2138
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 -... Line 8...
-
 
8
$Revision: 2138 $
-
 
9
 
-
 
10
macro __list_add new, prev, next
-
 
11
{
-
 
12
    mov [next+LHEAD.prev], new
-
 
13
    mov [new+LHEAD.next], next
-
 
14
    mov [new+LHEAD.prev], prev
-
 
15
    mov [prev+LHEAD.next], new
-
 
16
}
-
 
17
 
-
 
18
macro list_add new, head
-
 
19
{
-
 
20
    mov eax, [head+LHEAD.next]
-
 
21
    __list_add new, head, eax
-
 
22
}
-
 
23
 
-
 
24
macro list_add_tail new, head
-
 
25
{
-
 
26
    mov eax, [head+LHEAD.prev]
-
 
27
    __list_add new, eax, head
-
 
28
}
-
 
29
 
-
 
30
macro list_del entry
-
 
31
{
-
 
32
    mov edx, [entry+list_fd]
-
 
33
    mov ecx, [entry+list_bk]
-
 
34
    mov [edx+list_bk], ecx
Line 8... Line 35...
8
$Revision: 2130 $
35
    mov [ecx+list_fd], edx
-
 
36
}
-
 
37
 
9
 
38
struc MEM_BLOCK
10
 
39
{
11
struc MEM_BLOCK
-
 
12
{  .next_block  dd ?
-
 
13
   .prev_block  dd ? ;+4
40
   .list        LHEAD
14
   .list_fd     dd ? ;+8
41
   .next_block  dd ? ;+8
15
   .list_bk     dd ? ;+12
42
   .prev_block  dd ? ;+4
16
   .base        dd ? ;+16
43
   .base        dd ? ;+16
17
   .size        dd ? ;+20
44
   .size        dd ? ;+20
Line 18... Line -...
18
   .flags       dd ? ;+24
-
 
19
   .handle      dd ? ;+28
45
   .flags       dd ? ;+24
20
}
46
   .handle      dd ? ;+28
21
 
47
}
Line 22... Line 48...
22
MEM_LIST_OFFSET equ  8
48
 
Line 30... Line 56...
30
 
56
 
Line 31... Line 57...
31
MEM_BLOCK_SIZE equ 8*4
57
MEM_BLOCK_SIZE equ 8*4
32
 
58
 
33
block_next   equ MEM_BLOCK.next_block
59
block_next   equ MEM_BLOCK.next_block
34
block_prev   equ MEM_BLOCK.prev_block
60
block_prev   equ MEM_BLOCK.prev_block
35
list_fd      equ MEM_BLOCK.list_fd
61
list_fd      equ MEM_BLOCK.list.next
36
list_bk      equ MEM_BLOCK.list_bk
62
list_bk      equ MEM_BLOCK.list.prev
37
block_base   equ MEM_BLOCK.base
63
block_base   equ MEM_BLOCK.base
Line 38... Line 64...
38
block_size   equ MEM_BLOCK.size
64
block_size   equ MEM_BLOCK.size
Line 45... Line 71...
45
           jna @f
71
           jna @f
46
           mov op, 63
72
           mov op, 63
47
@@:
73
@@:
48
}
74
}
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
 
75
 
81
macro remove_from_used op
76
macro remove_from_used op
82
{
77
{
83
           mov edx, [op+list_fd]
78
           mov edx, [op+list_fd]
84
           mov ecx, [op+list_bk]
79
           mov ecx, [op+list_bk]
85
           mov [edx+list_bk], ecx
80
           mov [edx+list_bk], ecx
86
           mov [ecx+list_fd], edx
81
           mov [ecx+list_fd], edx
87
           mov [op+list_fd], 0
82
           mov [op+list_fd], 0
88
           mov [op+list_bk], 0
83
           mov [op+list_bk], 0
Line -... Line 84...
-
 
84
}
-
 
85
 
-
 
86
;Initial heap state
-
 
87
;
-
 
88
;+heap_size             terminator        USED_BLOCK
-
 
89
;+4096*MEM_BLOCK_SIZE   free space        FREE_BLOCK
-
 
90
;HEAP_BASE              heap_descriptors  USED_BLOCK
89
}
91
;
90
 
92
 
Line 91... Line 93...
91
align 4
93
align 4
92
proc init_kernel_heap
94
proc init_kernel_heap
-
 
95
 
93
 
96
            mov ecx, 64
94
           mov ecx, 64
97
            mov edi, mem_block_list
95
           mov edi, mem_block_list
98
@@:
-
 
99
            mov eax, edi
Line 96... Line 100...
96
           xor eax, eax
100
            stosd
97
           cld
101
            stosd
98
           rep stosd
102
            loop @B
99
 
103
 
Line 100... Line 104...
100
           mov ecx, 512/4
104
            mov ecx, 512/4
101
           mov edi, mem_block_map
105
            mov edi, mem_block_map
102
           not eax
106
            not eax
Line 103... Line 107...
103
           rep stosd
107
            rep stosd
104
 
108
 
105
           mov [mem_block_start], mem_block_map
109
            mov [mem_block_start], mem_block_map
Line 106... Line 110...
106
           mov [mem_block_end], mem_block_map+512
110
            mov [mem_block_end], mem_block_map+512
107
           mov [mem_block_arr], HEAP_BASE
111
            mov [mem_block_arr], HEAP_BASE
Line 119... Line 123...
119
           add edi, 0x1000
123
            add edi, 0x1000
120
           add edx, 0x1000
124
            add edx, 0x1000
121
           dec ecx
125
            dec ecx
122
           jnz .l1
126
            jnz .l1
Line 123... Line 127...
123
 
127
 
124
           mov edi, HEAP_BASE
128
            mov edi, HEAP_BASE                     ;descriptors
-
 
129
            mov ebx, HEAP_BASE+MEM_BLOCK_SIZE      ;free space
-
 
130
            mov ecx, HEAP_BASE+MEM_BLOCK_SIZE*2    ;terminator
125
           mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
131
 
126
           xor eax, eax
132
            xor eax, eax
127
           mov [edi+block_next], ebx
133
            mov [edi+block_next], ebx
128
           mov [edi+block_prev], eax
134
            mov [edi+block_prev], eax
129
           mov [edi+list_fd], eax
135
            mov [edi+list_fd], eax
130
           mov [edi+list_bk], eax
136
            mov [edi+list_bk], eax
131
           mov [edi+block_base], HEAP_BASE
137
            mov [edi+block_base], HEAP_BASE
132
           mov [edi+block_size], 4096*MEM_BLOCK_SIZE
138
            mov [edi+block_size], 4096*MEM_BLOCK_SIZE
Line 133... Line 139...
133
           mov [edi+block_flags], USED_BLOCK
139
            mov [edi+block_flags], USED_BLOCK
-
 
140
 
-
 
141
            mov [ecx+block_next], eax
-
 
142
            mov [ecx+block_prev], ebx
-
 
143
            mov [edi+list_fd], eax
-
 
144
            mov [edi+list_bk], eax
-
 
145
            mov [edi+block_base], 0
-
 
146
            mov [edi+block_size], 0
-
 
147
            mov [edi+block_flags], USED_BLOCK
134
 
148
 
135
           mov [ebx+block_next], eax
149
            mov [ebx+block_next], ecx
136
           mov [ebx+block_prev], eax
150
            mov [ebx+block_prev], edi
137
           mov [ebx+list_fd], eax
151
            mov [ebx+list_fd], eax
Line 138... Line 152...
138
           mov [ebx+list_bk], eax
152
            mov [ebx+list_bk], eax
Line 147... Line 161...
147
           mov [ebx+block_flags], FREE_BLOCK
161
            mov [ebx+block_flags], FREE_BLOCK
Line 148... Line 162...
148
 
162
 
149
           mov [mem_block_mask], eax
163
            mov [mem_block_mask], eax
Line 150... Line 164...
150
           mov [mem_block_mask+4],0x80000000
164
            mov [mem_block_mask+4],0x80000000
-
 
165
 
-
 
166
            mov ecx, mem_block_list+63*8
151
 
167
            list_add ebx, ecx
152
           mov [mem_block_list+63*4], ebx
168
 
153
           mov byte [mem_block_map], 0xFC
169
            mov byte [mem_block_map], 0xFC
154
           mov ecx, heap_mutex
170
            mov ecx, heap_mutex
155
           call mutex_init
171
            call mutex_init
Line 189... Line 205...
189
           and edx, [esi]
205
           and edx, [esi]
190
.find:
206
.find:
191
           bsf edi, edx
207
           bsf edi, edx
192
           jz .high_mask
208
           jz .high_mask
193
           add ebx, edi
209
           add ebx, edi
194
           mov edi, [mem_block_list+ebx*4]
210
           lea ecx, [mem_block_list+ebx*8]
-
 
211
           mov edi, ecx
195
.check_size:
212
.next:
-
 
213
           mov edi, [edi+list_fd]
-
 
214
           cmp edi, ecx
-
 
215
           je .err
196
           cmp eax, [edi+block_size]
216
           cmp eax, [edi+block_size]
197
           ja .next
217
           ja .next
198
           ret
218
           ret
-
 
219
.err:
-
 
220
           xor edi, edi
-
 
221
           ret
Line 199... Line 222...
199
 
222
 
200
.high_mask:
223
.high_mask:
201
           add esi, 4
224
           add esi, 4
202
           cmp esi, mem_block_mask+8
225
           cmp esi, mem_block_mask+8
203
           jae .err
226
           jae .err
204
           add ebx, 32
227
           add ebx, 32
205
           mov edx, [esi]
228
           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
-
 
Line 213... Line 229...
213
           ret
229
           jmp .find
214
 
230
 
Line 215... Line 231...
215
align 4
231
align 4
Line 233... Line 249...
233
           lea eax,[eax+ebx*8]
249
           lea eax,[eax+ebx*8]
234
           shl eax, 5
250
           shl eax, 5
235
           add eax, [mem_block_arr]
251
           add eax, [mem_block_arr]
236
           dec [free_blocks]
252
           dec [free_blocks]
237
           ret
253
           ret
-
 
254
 
238
align 4
255
align 4
239
free_mem_block:
256
free_mem_block:
240
           mov dword [eax], 0
257
           mov dword [eax], 0
241
           mov dword [eax+4], 0
258
           mov dword [eax+4], 0
242
           mov dword [eax+8], 0
259
           mov dword [eax+8], 0
Line 267... Line 284...
267
 
284
 
268
align 4
285
align 4
269
proc alloc_kernel_space stdcall, size:dword
286
proc alloc_kernel_space stdcall, size:dword
Line -... Line 287...
-
 
287
           local block_ind:DWORD
-
 
288
 
270
           local block_ind:DWORD
289
           xchg bx, bx
271
 
290
 
272
           push ebx
291
           push ebx
Line 273... Line -...
273
           push esi
-
 
274
           push edi
-
 
275
 
-
 
276
           mov ecx, heap_mutex
292
           push esi
277
           call mutex_lock
293
           push edi
278
 
294
 
279
           mov eax, [size]
295
           mov eax, [size]
Line 280... Line 296...
280
           add eax, 4095
296
           add eax, 4095
281
           and eax, not 4095
297
           and eax, not 4095
Line -... Line 298...
-
 
298
           mov [size], eax
-
 
299
 
-
 
300
           cmp eax, [heap_free]
-
 
301
           ja .error
-
 
302
 
282
           mov [size], eax
303
           mov ecx, heap_mutex
283
 
304
           call mutex_lock
284
           cmp eax, [heap_free]
305
 
Line 285... Line 306...
285
           ja .error
306
           mov eax, [size]
286
 
307
 
Line 287... Line 308...
287
           call get_small_block ; eax
308
           call get_small_block ; eax
Line 288... Line 309...
288
           test edi, edi
309
           test edi, edi
289
           jz .error
310
           jz .error_unlock
290
 
311
 
Line 291... Line 312...
291
           cmp [edi+block_flags], FREE_BLOCK
312
           cmp [edi+block_flags], FREE_BLOCK
292
           jne .error
313
           jne .error_unlock
293
 
314
 
Line 294... Line 315...
294
           mov [block_ind], ebx   ;index of allocated block
315
           mov [block_ind], ebx   ;index of allocated block
Line 295... Line 316...
295
 
316
 
296
           mov eax, [edi+block_size]
317
           mov eax, [edi+block_size]
297
           cmp eax, [size]
318
           cmp eax, [size]
298
           je .m_eq_size
319
           je .m_eq_size
299
 
320
 
300
           call alloc_mem_block
321
           call alloc_mem_block
301
           and eax, eax
-
 
302
           jz .error
-
 
303
 
322
           and eax, eax
304
           mov esi, eax           ;esi - splitted block
323
           jz .error_unlock
305
 
324
 
306
           mov [esi+block_next], edi
325
           mov esi, eax           ;esi - splitted block
307
           mov eax, [edi+block_prev]
326
 
308
           mov [esi+block_prev], eax
327
           mov [esi+block_next], edi
309
           mov [edi+block_prev], esi
328
           mov eax, [edi+block_prev]
310
           mov [esi+list_fd], 0
329
           mov [esi+block_prev], eax
Line 311... Line 330...
311
           mov [esi+list_bk], 0
330
           mov [edi+block_prev], esi
312
           and eax, eax
-
 
313
           jz @f
-
 
314
           mov [eax+block_next], esi
331
           mov [esi+list_fd], 0
315
@@:
-
 
316
           mov ebx, [edi+block_base]
-
 
317
           mov [esi+block_base], ebx
-
 
318
           mov edx, [size]
332
           mov [esi+list_bk], 0
319
           mov [esi+block_size], edx
333
           mov [eax+block_next], esi
Line 320... Line 334...
320
           add [edi+block_base], edx
334
 
Line 321... Line 335...
321
           sub [edi+block_size], edx
335
           mov ebx, [edi+block_base]
322
 
336
           mov [esi+block_base], ebx
323
           mov eax, [edi+block_size]
-
 
324
           shr eax, 12
337
           mov edx, [size]
325
           sub eax, 1
338
           mov [esi+block_size], edx
326
           cmp eax, 63
339
           add [edi+block_base], edx
327
           jna @f
340
           sub [edi+block_size], edx
328
           mov eax, 63
-
 
329
@@:
-
 
330
           cmp eax, [block_ind]
-
 
331
           je .m_eq_ind
-
 
332
 
-
 
333
           remove_from_list edi
-
 
334
 
-
 
335
           mov ecx, [block_ind]
341
 
-
 
342
           mov eax, [edi+block_size]
-
 
343
           calc_index eax
336
           mov [mem_block_list+ecx*4], edx
344
           cmp eax, [block_ind]
337
 
345
           je .m_eq_ind
338
           test edx, edx
346
 
339
           jnz @f
347
           list_del edi
340
           btr [mem_block_mask], ecx
348
 
341
@@:
349
           mov ecx, [block_ind]
342
           mov edx, [mem_block_list+eax*4]
350
           lea edx, [mem_block_list+ecx*8]
Line 343... Line 351...
343
           mov [edi+list_fd], edx
351
           cmp edx, [edx]
344
           test edx, edx
352
           jnz @f
345
           jz @f
353
           btr [mem_block_mask], ecx
-
 
354
@@:
-
 
355
           bts [mem_block_mask], eax
-
 
356
           lea edx, [mem_block_list+eax*8]   ;edx= list head
-
 
357
           list_add edi, edx
-
 
358
.m_eq_ind:
-
 
359
           mov ecx, mem_used.fd
-
 
360
           mov edx, [ecx+list_fd]
-
 
361
           mov [esi+list_fd], edx
-
 
362
           mov [esi+list_bk], ecx
-
 
363
           mov [ecx+list_fd], esi
-
 
364
           mov [edx+list_bk], esi
-
 
365
 
-
 
366
           mov [esi+block_flags], USED_BLOCK
346
           mov [edx+list_bk], edi
367
           mov ebx, [size]
347
@@:
368
           sub [heap_free], ebx
348
           mov [mem_block_list+eax*4], edi
369
 
349
           bts [mem_block_mask], eax
370
;           pushad
350
.m_eq_ind:
371
;           mov eax, [esi+block_base]
351
           mov ecx, mem_used.fd-MEM_LIST_OFFSET
372
;           mov ebx, [esi+block_base]
352
           mov edx, [ecx+list_fd]
373
;           shr ebx, 6
353
           mov [esi+list_fd], edx
374
;           add eax, ebx
354
           mov [esi+list_bk], ecx
375
;           shr ebx, 6
355
           mov [ecx+list_fd], esi
376
;           add eax, ebx
356
           mov [edx+list_bk], esi
377
;           shr eax, 12
357
 
378
;           and eax, 63
358
           mov [esi+block_flags], USED_BLOCK
379
;           inc [mem_hash_cnt+eax*4]
359
           mov ebx, [size]
380
;           popad
360
           sub [heap_free], ebx
381
 
361
           mov ecx, heap_mutex
382
           mov ecx, heap_mutex
362
           call mutex_unlock
383
           call mutex_unlock
363
           mov eax, [esi+block_base]
384
           mov eax, [esi+block_base]
364
           pop edi
385
           pop edi
365
           pop esi
386
           pop esi
Line 366... Line 387...
366
           pop ebx
387
           pop ebx
367
           ret
388
           ret
368
.m_eq_size:
389
.m_eq_size:
-
 
390
           list_del edi
-
 
391
           lea edx, [mem_block_list+ebx*8]
-
 
392
           cmp edx, [edx]
-
 
393
           jnz @f
-
 
394
           btr [mem_block_mask], ebx
-
 
395
@@:
-
 
396
           mov ecx, mem_used.fd
-
 
397
           mov edx, [ecx+list_fd]
-
 
398
           mov [edi+list_fd], edx
-
 
399
           mov [edi+list_bk], ecx
-
 
400
           mov [ecx+list_fd], edi
-
 
401
           mov [edx+list_bk], edi
-
 
402
 
369
           remove_from_list edi
403
           mov [edi+block_flags], USED_BLOCK
370
           mov [mem_block_list+ebx*4], edx
404
           mov ebx, [size]
371
           and edx, edx
405
           sub [heap_free], ebx
372
           jnz @f
406
 
373
           btr [mem_block_mask], ebx
407
;           pushad
374
@@:
408
;           mov eax, [edi+block_base]
375
           mov ecx, mem_used.fd-MEM_LIST_OFFSET
409
;           mov ebx, [edi+block_base]
-
 
410
;           shr ebx, 6
376
           mov edx, [ecx+list_fd]
411
;           add eax, ebx
377
           mov [edi+list_fd], edx
412
;           shr ebx, 6
378
           mov [edi+list_bk], ecx
413
;           add eax, ebx
-
 
414
;           shr eax, 12
379
           mov [ecx+list_fd], edi
415
;           and eax, 63
380
           mov [edx+list_bk], edi
416
;           inc [mem_hash_cnt+eax*4]
381
 
417
;           popad
382
           mov [edi+block_flags], USED_BLOCK
418
 
383
           mov ebx, [size]
419
           mov ecx, heap_mutex
384
           sub [heap_free], ebx
420
           call mutex_unlock
Line 385... Line 421...
385
           mov ecx, heap_mutex
421
           mov eax, [edi+block_base]
386
           call mutex_unlock
422
           pop edi
-
 
423
           pop esi
387
           mov eax, [edi+block_base]
424
           pop ebx
388
           pop edi
-
 
389
           pop esi
-
 
Line 390... Line 425...
390
           pop ebx
425
           ret
391
           ret
426
 
Line 392... Line 427...
392
.error:
427
.error_unlock:
393
           mov ecx, heap_mutex
428
           mov ecx, heap_mutex
394
           call mutex_unlock
429
           call mutex_unlock
395
           xor eax, eax
430
.error:
396
           pop edi
431
           xor eax, eax
Line 397... Line 432...
397
           pop esi
432
           pop edi
398
           pop ebx
433
           pop esi
399
           ret
434
           pop ebx
400
endp
435
           ret
401
 
436
endp
402
align 4
437
 
403
proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
438
align 4
Line -... Line 439...
-
 
439
proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
-
 
440
 
-
 
441
           xchg bx, bx
-
 
442
 
-
 
443
           mov ecx, heap_mutex
-
 
444
           call mutex_lock
-
 
445
 
-
 
446
           mov eax, [base]
-
 
447
           mov esi, [mem_used.fd]
-
 
448
@@:
-
 
449
           cmp esi, mem_used.fd
-
 
450
           je .fail
-
 
451
 
404
           push ebx
452
           cmp [esi+block_base], eax
405
           push esi
453
           je .found
Line 406... Line 454...
406
           push edi
454
           mov esi, [esi+list_fd]
407
 
-
 
408
           mov ecx, heap_mutex
-
 
409
           call mutex_lock
-
 
410
 
455
           jmp @b
411
           mov eax, [base]
456
.found:
Line 412... Line 457...
412
           mov esi, [mem_used.fd]
457
           cmp [esi+block_flags], USED_BLOCK
Line 413... Line 458...
413
@@:
458
           jne .fail
414
           cmp esi, mem_used.fd-MEM_LIST_OFFSET
459
 
415
           je .fail
-
 
416
 
-
 
417
           cmp [esi+block_base], eax
-
 
418
           je .found
460
 
419
           mov esi, [esi+list_fd]
-
 
420
           jmp @b
461
;           pushad
421
.found:
462
;           mov eax, [esi+block_base]
Line -... Line 463...
-
 
463
;           mov ebx, [esi+block_base]
-
 
464
;           shr ebx, 6
-
 
465
;           add eax, ebx
-
 
466
;           shr ebx, 6
-
 
467
;           add eax, ebx
-
 
468
;           shr eax, 12
-
 
469
;           and eax, 63
422
           cmp [esi+block_flags], USED_BLOCK
470
;           dec [mem_hash_cnt+eax*4]
423
           jne .fail
471
;           popad
424
 
472
 
425
           mov eax, [esi+block_size]
473
           mov eax, [esi+block_size]
426
           add [heap_free], eax
-
 
427
 
-
 
428
           mov edi, [esi+block_next]
-
 
429
           test edi, edi
474
           add [heap_free], eax
430
           jz .prev
475
 
Line 431... Line 476...
431
 
476
           mov edi, [esi+block_next]
Line 432... Line 477...
432
           cmp [edi+block_flags], FREE_BLOCK
477
           cmp [edi+block_flags], FREE_BLOCK
433
           jne .prev
478
           jne .prev
434
 
-
 
435
           remove_from_free edi
-
 
436
 
479
 
437
           mov edx, [edi+block_next]
480
           list_del edi
438
           mov [esi+block_next], edx
481
 
439
           test edx, edx
482
           mov edx, [edi+block_next]
Line 440... Line 483...
440
           jz @f
483
           mov [esi+block_next], edx
441
 
484
           mov [edx+block_prev], esi
442
           mov [edx+block_prev], esi
485
           mov ecx, [edi+block_size]
443
@@:
486
           add [esi+block_size], ecx
Line 444... Line 487...
444
           mov ecx, [edi+block_size]
487
 
445
           add [esi+block_size], ecx
488
           calc_index ecx
446
 
489
 
447
           mov eax, edi
490
           lea edx, [mem_block_list+ecx*8]
Line 448... Line 491...
448
           call free_mem_block
491
           cmp edx, [edx]
449
.prev:
492
           jne @F
450
           mov edi, [esi+block_prev]
493
           btr [mem_block_mask], ecx
Line 451... Line 494...
451
           test edi, edi
494
@@:
452
           jz .insert
495
           mov eax, edi
453
 
-
 
454
           cmp [edi+block_flags], FREE_BLOCK
-
 
455
           jne .insert
-
 
456
 
496
           call free_mem_block
457
           remove_from_used esi
497
.prev:
458
 
-
 
459
           mov edx, [esi+block_next]
-
 
460
           mov [edi+block_next], edx
-
 
461
           test edx, edx
-
 
462
           jz @f
-
 
463
           mov [edx+block_prev], edi
498
           mov edi, [esi+block_prev]
464
@@:
-
 
465
           mov eax, esi
-
 
466
           call free_mem_block
499
           cmp [edi+block_flags], FREE_BLOCK
-
 
500
           jne .insert
-
 
501
 
467
 
502
           remove_from_used esi
468
           mov ecx, [edi+block_size]
503
 
469
           mov eax, [esi+block_size]
504
           mov edx, [esi+block_next]
470
           add eax, ecx
505
           mov [edi+block_next], edx
471
           mov [edi+block_size], eax
506
           mov [edx+block_prev], edi
472
 
-
 
473
           calc_index eax
-
 
474
           calc_index ecx
-
 
475
           cmp eax, ecx
507
 
476
           je .m_eq
508
           mov eax, esi
477
 
509
           call free_mem_block
478
           push ecx
-
 
-
 
510
 
479
           remove_from_list edi
511
           mov ecx, [edi+block_size]
480
           pop ecx
512
           mov eax, [esi+block_size]
-
 
513
           add eax, ecx
-
 
514
           mov [edi+block_size], eax
Line 481... Line -...
481
 
-
 
482
           cmp [mem_block_list+ecx*4], edi
-
 
483
           jne @f
-
 
484
           mov [mem_block_list+ecx*4], edx
-
 
485
@@:
-
 
486
           cmp [mem_block_list+ecx*4], 0
-
 
487
           jne @f
-
 
488
           btr [mem_block_mask], ecx
-
 
489
@@:
-
 
490
           mov esi, [mem_block_list+eax*4]
-
 
491
           mov [mem_block_list+eax*4], edi
-
 
492
           mov [edi+list_fd], esi
-
 
493
           test esi, esi
-
 
494
           jz @f
-
 
495
           mov [esi+list_bk], edi
-
 
496
@@:
-
 
497
           bts [mem_block_mask], eax
-
 
498
.m_eq:
515
 
499
           mov ecx, heap_mutex
516
           calc_index eax                     ;new index
500
           call mutex_unlock
517
           calc_index ecx                     ;old index
501
           xor eax, eax
518
           cmp eax, ecx
502
           not eax
-
 
503
           pop edi
-
 
504
           pop esi
-
 
505
           pop ebx
519
           je .m_eq
506
           ret
520
 
Line 507... Line 521...
507
.insert:
521
           push ecx
508
           remove_from_used esi
522
           list_del edi
Line 619... Line 633...
619
           call mutex_lock
633
           call mutex_lock
Line 620... Line 634...
620
 
634
 
621
           mov eax, [base]
635
           mov eax, [base]
622
           mov esi, [mem_used.fd]
636
           mov esi, [mem_used.fd]
623
@@:
637
@@:
624
           cmp esi, mem_used.fd-MEM_LIST_OFFSET
638
           cmp esi, mem_used.fd
Line 625... Line 639...
625
           je .fail
639
           je .fail
626
 
640
 
627
           cmp [esi+block_base], eax
641
           cmp [esi+block_base], eax
Line 1542... Line 1556...
1542
           pop edi
1556
           pop edi
1543
           pop esi
1557
           pop esi
1544
.fail:
1558
.fail:
1545
           ret
1559
           ret
1546
endp
1560
endp
-
 
1561
 
-
 
1562
align 4
-
 
1563
sys_perf:
-
 
1564
           test ecx, ecx
-
 
1565
           jz .fail
-
 
1566
 
-
 
1567
           mov edi, ecx
-
 
1568
           mov esi, mem_hash_cnt
-
 
1569
           mov ecx, 64
-
 
1570
           rep movsd
-
 
1571
.fail:
-
 
1572
           ret