Subversion Repositories Kolibri OS

Rev

Rev 300 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
300 serge 1
 
2
#include "kolibri.h"
324 serge 3
300 serge 4
 
324 serge 5
6
 
300 serge 7
8
 
324 serge 9
{ mchunkptr chp;
300 serge 10
  int i;
11
  char  *p;
324 serge 12
300 serge 13
 
324 serge 14
  p = 0x2600000;      //(char*)UserAlloc(psize);
15
  ms.top = (mchunkptr)p;
300 serge 16
  ms.topsize = psize;
17
  ms.smallmap=0;
324 serge 18
  ms.treemap=0;
19
300 serge 20
 
21
  chp->head=psize|1;
22
23
 
24
  {
25
    mchunkptr p = &ms.smallbins[i];
324 serge 26
    p->fd = p;
27
    p->bk = p;
28
300 serge 29
 
30
}
31
32
 
324 serge 33
{ size_t nb, psize,rsize;
300 serge 34
  dword idx;
35
  dword smallbits;
36
  mchunkptr B,F,p,r;
324 serge 37
  void *mem;
300 serge 38
39
 
40
324 serge 41
 
42
  {
43
    idx = nb  >> 3;
44
//    smallbits= (-1<
45
    _asm
46
    {
47
      mov ecx, [idx]
48
      or eax, -1
49
      shl eax, cl
50
      and eax, dword ptr [ms]
51
      mov dword ptr [smallbits], eax
52
    }
53
    if (smallbits)
54
    {
55
      _asm
56
      { bsf eax, dword ptr [smallbits]
57
        mov [idx], eax
58
      };
59
60
 
61
      rsize= psize-nb;
62
63
 
64
      p = B->fd;
65
      F = p->fd;
66
      if (B == F)
67
      {
68
//        ms.smallmap &=  ~(1<< idx);
69
        _asm
70
        {
71
          mov eax, [idx]
72
          btr dword ptr [ms], eax
73
        }
74
      }
75
      B->fd = F;
76
      F->bk = B;
77
78
 
79
      {
80
        p->head = psize|PINUSE_BIT|CINUSE_BIT;
81
        ((mchunkptr)((char*)p + psize))->head |= PINUSE_BIT;
82
        return chunk2mem(p);
83
      };
84
      p->head = nb|PINUSE_BIT|CINUSE_BIT;
85
      r = chunk_plus_offset(p, nb);
86
      r->head = rsize|PINUSE_BIT;
87
      ((mchunkptr)((char*)r + rsize))->prev_foot = rsize;
88
      {
89
        dword I;
90
        mchunkptr B;
91
        mchunkptr F;
92
93
 
94
        ms.smallmap |=  1<< I;
95
        B = &ms.smallbins[I];
96
        F = B->fd;
97
        B->fd = r;
98
        F->bk = r;
99
        r->fd = F;
100
        r->bk = B;
101
       }
102
      return chunk2mem(p);
103
    }
104
    if (ms.treemap != 0 && (mem = malloc_small(nb)) != 0)
105
      return mem;
106
  }
107
  else
108
  {
109
    if (ms.treemap != 0 && (mem = malloc_large(nb)) != 0)
110
      return mem;
111
  };
112
113
 
114
  {
115
    size_t rsize = ms.topsize -= nb;
116
    mchunkptr p = ms.top;
117
    mchunkptr r = ms.top = chunk_plus_offset(p, nb);
118
    r->head = rsize | PINUSE_BIT;
119
    p->head = nb |PINUSE_BIT|CINUSE_BIT;
120
    return chunk2mem(p);
121
  };
122
300 serge 123
 
124
};
125
126
 
324 serge 127
{ size_t psize;
300 serge 128
  size_t prevsize;
129
  size_t nsize;
130
  mchunkptr next;
131
  mchunkptr prev;
132
133
 
324 serge 134
  if(p->head & CINUSE_BIT)
300 serge 135
  {
136
    psize = p->head & (~3);
324 serge 137
    next = chunk_plus_offset(p, psize);
138
300 serge 139
 
140
    {
141
      prevsize = p->prev_foot;
324 serge 142
      prev=(mchunkptr)(((char*)p) - prevsize);
143
      psize += prevsize;
144
      p = prev;
145
      if (prevsize < 256)
146
      {
147
        dword I;
148
        mchunkptr F = p->fd;
149
        mchunkptr B = p->bk;
150
        I = prevsize>>3;
151
        if (F == B)
152
        {
153
          ms.smallmap &=  ~(1<< I);
154
        }
155
        F->bk = B;
156
        B->fd = F;
157
      }
158
      else
159
        unlink_large_chunk((tchunkptr)p);
160
    };
300 serge 161
162
 
163
    {
164
      if (! (next->head & CINUSE_BIT))
324 serge 165
      {
166
        if (next == ms.top)
167
        {  size_t tsize = ms.topsize += psize;
168
           ms.top = p;
169
           p->head = tsize | PINUSE_BIT;
170
           return;
171
         }
172
173
 
174
         psize += nsize;
175
176
 
177
         {
178
           dword I;
179
           mchunkptr F = next->fd;
180
           mchunkptr B = next->bk;
181
           I = nsize>>3;
182
           if (F == B)
183
             ms.smallmap &=  ~(1<< I);
184
           F->bk = B;
185
           B->fd = F;
186
         }
187
         else
188
           unlink_large_chunk((tchunkptr)next);
189
190
 
191
         ((mchunkptr)((char*)p+psize))->prev_foot = psize;
192
      }
193
      else
194
      {
195
        next->head &= ~PINUSE_BIT;
196
        p->head = psize|PINUSE_BIT;
197
        ((mchunkptr)((char*)p+psize))->prev_foot = psize;
198
      };
199
      insert_chunk(p,psize);
200
    };
300 serge 201
  };
202
}
203
204
 
324 serge 205
{
206
  dword I;
207
  mchunkptr B;
208
  mchunkptr F;
209
  if (S < 256)
210
  {
211
    I  = S>>3;
212
    B = &ms.smallbins[I];
213
    F = B->fd;
214
    ms.smallmap |=  1<< I;
215
216
 
217
    F->bk = P;
218
    P->fd = F;
219
    P->bk = B;
220
  }
221
  else
222
    insert_large_chunk((tchunkptr)P, S);
223
};
224
300 serge 225
 
226
static void insert_small_chunk(mchunkptr p, size_t s)
324 serge 227
{
228
  DWORD I  = s>>3;
229
230
 
231
  mchunkptr F = B->fd;
232
  if (!(ms.smallmap & 1<
233
    ms.smallmap |=  1<< I;
234
235
 
236
  F->bk = p;
237
  p->fd = F;
238
  p->bk = B;
239
}
300 serge 240
*********/
241
242
 
324 serge 243
{  dword idx;
244
300 serge 245
 
324 serge 246
    {   mov edx, [s]
247
        shr edx, 8
248
        bsr eax, edx
249
        lea ecx, [eax+7]
250
        mov edx, [s]
251
        shr edx, cl
252
        and edx, 1
253
        lea eax, [edx+eax*2]
254
        mov [idx], eax
255
    };
256
300 serge 257
 
324 serge 258
};
259
300 serge 260
 
324 serge 261
{
262
  tbinptr* H;
263
  dword I;
264
  I = compute_tree_index(S);
265
  H = &ms.treebins[I];
266
  X->index = I;
267
  X->child[0] = X->child[1] = 0;
268
  if (!(ms.treemap & 1<
269
  {
270
    ms.treemap |= 1<
271
    *H = X;
272
    X->parent = (tchunkptr)H;
273
    X->fd = X->bk = X;
274
  }
275
  else
276
  {
277
    tchunkptr T = *H;
278
    size_t K = S << leftshift_for_tree_index(I);
279
    for (;;)
280
    {
281
      if ((T->head & ~INUSE_BITS) != S)
282
      {
283
        tchunkptr* C = &(T->child[(K >> 31) & 1]);
284
        K <<= 1;
285
        if (*C != 0)
286
          T = *C;
287
        else
288
        {
289
          *C = X;
290
          X->parent = T;
291
          X->fd = X->bk = X;
292
          break;
293
        }
294
      }
295
      else
296
      {
297
        tchunkptr F = T->fd;
298
        T->fd = F->bk = X;
299
        X->fd = F;
300
        X->bk = T;
301
        X->parent = 0;
302
        break;
303
      };
304
    };
305
  };
306
};
307
308
 
309
{
310
  tchunkptr t, v;
311
  mchunkptr r;
312
  size_t rsize;
313
  dword i;
314
315
 
316
  { bsf ecx,dword ptr [ms+4]
317
    mov [i], ecx
318
  }
319
  v = t =  ms.treebins[i];
320
  rsize = (t->head & ~INUSE_BITS) - nb;
321
322
 
323
  {
324
    size_t trem = (t->head & ~INUSE_BITS) - nb;
325
    if (trem < rsize)
326
    { rsize = trem;
327
      v = t;
328
    }
329
  }
330
331
 
332
  unlink_large_chunk(v);
333
  if (rsize < 16)
334
  {
335
    v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT;
336
    ((mchunkptr)((char*)v+rsize + nb))->head |= PINUSE_BIT;
337
  }
338
  else
339
  {
340
    v->head = nb|PINUSE_BIT|CINUSE_BIT;
341
    r->head = rsize|PINUSE_BIT;
342
    ((mchunkptr)((char*)r+rsize))->prev_foot = rsize;
343
    insert_chunk(r, rsize);
344
//    replace_dv(r, rsize);
345
  }
346
  return chunk2mem(v);
347
}
348
349
 
350
static void replace_dv(mchunkptr P, size_t S)
351
{
352
  size_t DVS = ms.dvsize;
353
  if (DVS != 0)
354
  {
355
    mchunkptr DV = ms.dv;
356
    insert_small_chunk(DV, DVS);
357
  }
358
  ms.dvsize = S;
359
  ms.dv = P;
360
}
361
***********/
362
363
 
364
{
365
  tchunkptr XP = X->parent;
366
  tchunkptr R;
367
  if (X->bk != X)
368
  {
369
    tchunkptr F = X->fd;
370
    R = X->bk;
371
    F->bk = R;
372
    R->fd = F;
373
  }
374
  else
375
  {
376
    tchunkptr* RP;
377
    if (((R = *(RP = &(X->child[1]))) != 0) ||
378
        ((R = *(RP = &(X->child[0]))) != 0))
379
    {
380
      tchunkptr* CP;
381
      while ((*(CP = &(R->child[1])) != 0) ||
382
             (*(CP = &(R->child[0])) != 0))
383
      {
384
        R = *(RP = CP);
385
      }
386
      *RP = 0;
387
    }
388
  }
389
  if (XP != 0)
390
  {
391
    tbinptr* H = &ms.treebins[X->index];
392
    if (X == *H)
393
    {
394
      if ((*H = R) == 0)
395
        ms.treemap &= ~(1<index);
396
    }
397
    else
398
    {
399
      if (XP->child[0] == X)
400
        XP->child[0] = R;
401
      else
402
        XP->child[1] = R;
403
    };
404
    if (R != 0)
405
    {
406
      tchunkptr C0, C1;
407
      R->parent = XP;
408
      if ((C0 = X->child[0]) != 0)
409
      {
410
          R->child[0] = C0;
411
          C0->parent = R;
412
      }
413
      if ((C1 = X->child[1]) != 0)
414
      {
415
        R->child[1] = C1;
416
        C1->parent = R;
417
      }
418
    }
419
  }
420
}
421
422
 
423
{
424
  tchunkptr v = 0;
425
  size_t rsize = -nb; /* Unsigned negation */
426
  tchunkptr t;
427
  dword idx;
428
  idx = compute_tree_index(nb);
429
430
 
431
  {
432
    /* Traverse tree for this bin looking for node with size == nb */
433
    size_t sizebits = nb << leftshift_for_tree_index(idx);
434
    tchunkptr rst = 0;  /* The deepest untaken right subtree */
435
    for (;;)
436
    {
437
      tchunkptr rt;
438
      size_t trem = (t->head & ~INUSE_BITS) - nb;
439
440
 
441
      {
442
        v = t;
443
        if ((rsize = trem) == 0)
444
          break;
445
      }
446
      rt = t->child[1];
447
      t = t->child[(sizebits >> 31) & 1];
448
      if (rt != 0 && rt != t)
449
        rst = rt;
450
      if (t == 0)
451
      {
452
        t = rst; /* set t to least subtree holding sizes > nb */
453
        break;
454
      }
455
      sizebits <<= 1;
456
    }
457
  }
458
459
 
460
  { /* set t to root of next non-empty treebin */
461
    dword leftbits = (-1<
462
    if (leftbits != 0)
463
    { dword i;
464
      _asm
465
      { bsf eax, [leftbits]
466
        mov [i], eax
467
      }
468
      t = ms.treebins[i];
469
    }
470
  }
471
472
 
473
  { /* find smallest of tree or subtree */
474
    size_t trem = (t->head & ~INUSE_BITS) - nb;
475
    if (trem < rsize)
476
    {
477
      rsize = trem;
478
      v = t;
479
    }
480
    t = leftmost_child(t);
481
  }
482
483
 
484
  if (v != 0)
485
  {
486
    mchunkptr r = chunk_plus_offset((mchunkptr)v, nb);
487
    unlink_large_chunk(v);
488
    if (rsize < 16)
489
    {
490
      v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT;
491
      ((mchunkptr)((char*)v+rsize + nb))->head |= PINUSE_BIT;
492
    }
493
    else
494
    {
495
      v->head = nb|PINUSE_BIT|CINUSE_BIT;
496
      r->head = rsize|PINUSE_BIT;
497
      ((mchunkptr)((char*)r+rsize))->prev_foot = rsize;
498
      insert_chunk((mchunkptr)r, rsize);
499
    }
500
    return chunk2mem(v);
501
  }
502
  return 0;
503
}
504
505
 
506
                               size_t bytes);
507
508
 
509
{
510
  if (oldmem == 0)
511
    return dlmalloc(bytes);
512
  else
513
  {
514
    struct m_state *m = &ms;
515
    return internal_realloc(m, oldmem, bytes);
516
  }
517
};
518
519
 
520
521
 
522
#define set_inuse(M,p,s)\
523
  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
524
  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
525
526
 
527
{ mchunkptr oldp;
528
  size_t oldsize;
529
  mchunkptr next;
530
  mchunkptr newp;
531
  void* extra;
532
533
 
534
    return 0;
535
536
 
537
  oldsize = oldp->head & ~INUSE_BITS;
538
  next = chunk_plus_offset(oldp, oldsize);
539
  newp = 0;
540
  extra = 0;
541
542
 
543
544
 
545
       ((char*)oldp < (char*)next)&&
546
       (next->head & PINUSE_BIT))
547
  {
548
    size_t nb = ((bytes+7)&~7)+8;
549
    if (oldsize >= nb)
550
    { /* already big enough */
551
      size_t rsize = oldsize - nb;
552
      newp = oldp;
553
      if (rsize >= 16)
554
      {
555
        mchunkptr remainder = chunk_plus_offset(newp, nb);
556
        set_inuse(m, newp, nb);
557
        set_inuse(m, remainder, rsize);
558
        extra = chunk2mem(remainder);
559
      }
560
    }
561
    else
562
    if (next == m->top && oldsize + m->topsize > nb)
563
    {
564
        /* Expand into top */
565
      size_t newsize = oldsize + m->topsize;
566
      size_t newtopsize = newsize - nb;
567
      mchunkptr newtop = chunk_plus_offset(oldp, nb);
568
      set_inuse(m, oldp, nb);
569
      newtop->head = newtopsize |PINUSE_BIT;
570
      m->top = newtop;
571
      m->topsize = newtopsize;
572
      newp = oldp;
573
    }
574
  }
575
  else
576
  {
577
    return 0;
578
  }
579
580
 
581
 
582
  {
583
    if (extra != 0)
584
       dlfree(extra);
585
586
 
587
    return chunk2mem(newp);
588
  }
589
  else
590
  {
591
    void* newmem = dlmalloc(bytes);
592
    if (newmem != 0)
593
    {
594
       size_t oc = oldsize - 4;
595
       memcpy(newmem, oldmem, (oc < bytes)? oc : bytes);
596
       dlfree(oldmem);
597
    }
598
    return newmem;
599
  }
600
  return 0;
601
}
602
>
603