Subversion Repositories Kolibri OS

Rev

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

Rev 861 Rev 862
Line 47... Line 47...
47
   u32_t i;
47
   u32_t i;
48
 
48
 
Line 49... Line 49...
49
   ASSERT(base != 0);
49
   ASSERT(base != 0);
50
   ASSERT(size != 0)
50
   ASSERT(size != 0)
51
   ASSERT(base & 0x3FFFFF == 0);
51
   ASSERT((base & 0x3FFFFF) == 0);
52
   ASSERT(size & 0x3FFFFF == 0);
52
   ASSERT((size & 0x3FFFFF) == 0);
Line 53... Line 53...
53
 
53
 
54
   for (i = 0; i < 32; i++)
54
   for (i = 0; i < 32; i++)
55
   {
55
   {
56
     list_initialize(&lheap.list[i]);
56
     list_initialize(&lheap.list[i]);
Line 82... Line 82...
82
 
82
 
Line 83... Line 83...
83
   count_t idx0;
83
   count_t idx0;
84
   u32_t mask;
84
   u32_t mask;
Line 85... Line 85...
85
 
85
 
Line 86... Line 86...
86
   ASSERT(size & 0x3FFFFF == 0);
86
   ASSERT((size & 0x3FFFFF) == 0);
87
 
87
 
Line 88... Line 88...
88
   idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31;
88
   idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31;
89
   mask = lheap.availmask & ( -1<
89
   mask = lheap.availmask & ( -1<
-
 
90
 
-
 
91
   if(mask)
-
 
92
   {
-
 
93
     if(idx0 == 31)
-
 
94
     {
-
 
95
        md_t *tmp = (md_t*)lheap.list[31].next;
-
 
96
        while((link_t*)tmp != &lheap.list[31])
-
 
97
        {
-
 
98
          if(tmp->size >= size)
-
 
99
          {
-
 
100
            DBG("remove large tmp %x\n", tmp);
-
 
101
 
-
 
102
            md = tmp;
-
 
103
            break;
-
 
104
          };
-
 
105
        };
-
 
106
        tmp = (md_t*)tmp->link.next;
90
 
107
     }
Line 91... Line 108...
91
   if(mask)
108
     else
Line 92... Line 109...
92
   {
109
     {
-
 
110
       idx0 = _bsf(mask);
93
     idx0 = _bsf(mask);
111
 
94
 
112
       ASSERT( !list_empty(&lheap.list[idx0]))
95
     ASSERT( !list_empty(&lheap.list[idx0]))
113
 
Line 96... Line 114...
96
 
114
       md = (md_t*)lheap.list[idx0].next;
Line 135... Line 153...
135
 
153
 
Line 136... Line 154...
136
   count_t idx0;
154
   count_t idx0;
137
   u32_t mask;
155
   u32_t mask;
Line 138... Line 156...
138
 
156
 
Line 139... Line 157...
139
   ASSERT(size & 0xFFF == 0);
157
   ASSERT((size & 0xFFF) == 0);
Line 140... Line 158...
140
 
158
 
141
   efl = safe_cli();
159
   efl = safe_cli();
Line 142... Line 160...
142
 
160
 
Line 143... Line 161...
143
   idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31;
161
   idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31;
144
   mask = sheap.availmask & ( -1<
162
   mask = sheap.availmask & ( -1<
145
 
163
 
146
   //printf("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask);
-
 
147
 
164
   DBG("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask);
148
   if(mask)
-
 
149
   {
-
 
150
     md_t *tmp;
-
 
151
 
165
 
152
     idx0 = _bsf(mask);
-
 
153
 
166
   if(mask)
154
     ASSERT( !list_empty(&sheap.list[idx0]))
167
   {
155
 
168
     if(idx0 == 31)
156
     tmp = (md_t*)sheap.list[idx0].next;
169
     {
157
 
-
 
158
     while((link_t*)tmp != &sheap.list[idx0])
-
 
159
     {
-
 
160
       if(tmp->size >= size)
-
 
161
       {
170
        md_t *tmp = (md_t*)sheap.list[31].next;
162
         //printf("remove tmp %x\n", tmp);
171
        while((link_t*)tmp != &sheap.list[31])
163
         list_remove((link_t*)tmp);
172
        {
164
         if(list_empty(&sheap.list[idx0]))
173
          if(tmp->size >= size)
165
           _reset_smask(idx0);
174
          {
-
 
175
             md = tmp;
-
 
176
             break;
-
 
177
          };
-
 
178
          tmp = (md_t*)tmp->link.next;
-
 
179
        };
-
 
180
     }
-
 
181
     else
166
         md = tmp;
182
     {
Line 167... Line 183...
167
         break;
183
       idx0 = _bsf(mask);
-
 
184
       ASSERT( !list_empty(&sheap.list[idx0]))
-
 
185
       md = (md_t*)sheap.list[idx0].next;
-
 
186
     }
-
 
187
   };
-
 
188
 
-
 
189
   if(md)
-
 
190
   {
-
 
191
     DBG("remove md %x\n", md);
168
       };
192
 
169
       tmp = (md_t*)tmp->link.next;
193
     list_remove((link_t*)md);
170
     };
194
     if(list_empty(&sheap.list[idx0]))
-
 
195
       _reset_smask(idx0);
-
 
196
   }
-
 
197
   else
171
   };
198
   {
172
 
199
     md_t *lmd;
173
   if( !md)
200
     lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF);
174
   {
201
 
175
     md_t *lmd;
202
     DBG("get large md %x\n", lmd);
Line 206... Line 233...
206
     md->size-= size;
233
     md->size-= size;
207
 
234
 
Line 208... Line 235...
208
     idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31;
235
     idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31;
Line 209... Line 236...
209
 
236
 
Line 210... Line 237...
210
     //printf("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1);
237
     DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1);
211
 
238
 
212
     if( idx1 < 31)
239
     if( idx1 < 31)
213
       list_prepend(&md->link, &sheap.list[idx1]);
240
       list_prepend(&md->link, &sheap.list[idx1]);
Line 317... Line 344...
317
   size = (size+4095)&~4095;
344
   size = (size+4095)&~4095;
Line 318... Line 345...
318
 
345
 
Line 319... Line 346...
319
   md = find_small_md(size);
346
   md = find_small_md(size);
-
 
347
 
320
 
348
   DBG("alloc_kernel_space: %x size %x\n\n",md->base, size);
321
  // printf("alloc_kernel_space: %x size %x\n\n",md->base, size);
349
 
322
   if( md )
350
   if( md )
323
     return (void*)md->base;
351
     return (void*)md->base;