Subversion Repositories Kolibri OS

Rev

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