Subversion Repositories HelenOS-historic

Rev

Rev 786 | Rev 788 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 786 Rev 787
Line 226... Line 226...
226
 * @return Number of freed pages
226
 * @return Number of freed pages
227
 */
227
 */
228
static count_t slab_obj_destroy(slab_cache_t *cache, void *obj,
228
static count_t slab_obj_destroy(slab_cache_t *cache, void *obj,
229
                slab_t *slab)
229
                slab_t *slab)
230
{
230
{
-
 
231
    int freed = 0;
-
 
232
 
231
    if (!slab)
233
    if (!slab)
232
        slab = obj2slab(obj);
234
        slab = obj2slab(obj);
233
 
235
 
234
    ASSERT(slab->cache == cache);
236
    ASSERT(slab->cache == cache);
235
    ASSERT(slab->available < cache->objects);
237
    ASSERT(slab->available < cache->objects);
236
 
238
 
-
 
239
    if (cache->destructor)
-
 
240
        freed = cache->destructor(obj);
-
 
241
   
237
    spinlock_lock(&cache->slablock);
242
    spinlock_lock(&cache->slablock);
238
 
243
 
239
    *((int *)obj) = slab->nextavail;
244
    *((int *)obj) = slab->nextavail;
240
    slab->nextavail = (obj - slab->start)/cache->size;
245
    slab->nextavail = (obj - slab->start)/cache->size;
241
    slab->available++;
246
    slab->available++;
Line 244... Line 249...
244
    if (slab->available == cache->objects) {
249
    if (slab->available == cache->objects) {
245
        /* Free associated memory */
250
        /* Free associated memory */
246
        list_remove(&slab->link);
251
        list_remove(&slab->link);
247
        spinlock_unlock(&cache->slablock);
252
        spinlock_unlock(&cache->slablock);
248
 
253
 
249
        return slab_space_free(cache, slab);
254
        return freed + slab_space_free(cache, slab);
250
 
255
 
251
    } else if (slab->available == 1) {
256
    } else if (slab->available == 1) {
252
        /* It was in full, move to partial */
257
        /* It was in full, move to partial */
253
        list_remove(&slab->link);
258
        list_remove(&slab->link);
254
        list_prepend(&slab->link, &cache->partial_slabs);
259
        list_prepend(&slab->link, &cache->partial_slabs);
255
    }
260
    }
256
    spinlock_unlock(&cache->slablock);
261
    spinlock_unlock(&cache->slablock);
257
    return 0;
262
    return freed;
258
}
263
}
259
 
264
 
260
/**
265
/**
261
 * Take new object from slab or create new if needed
266
 * Take new object from slab or create new if needed
262
 *
267
 *
Line 288... Line 293...
288
        list_remove(&slab->link);
293
        list_remove(&slab->link);
289
    }
294
    }
290
    obj = slab->start + slab->nextavail * cache->size;
295
    obj = slab->start + slab->nextavail * cache->size;
291
    slab->nextavail = *((int *)obj);
296
    slab->nextavail = *((int *)obj);
292
    slab->available--;
297
    slab->available--;
-
 
298
 
293
    if (! slab->available)
299
    if (! slab->available)
294
        list_prepend(&slab->link, &cache->full_slabs);
300
        list_prepend(&slab->link, &cache->full_slabs);
295
    else
301
    else
296
        list_prepend(&slab->link, &cache->partial_slabs);
302
        list_prepend(&slab->link, &cache->partial_slabs);
297
 
303
 
298
    spinlock_unlock(&cache->slablock);
304
    spinlock_unlock(&cache->slablock);
-
 
305
 
-
 
306
    if (cache->constructor && cache->constructor(obj, flags)) {
-
 
307
        /* Bad, bad, construction failed */
-
 
308
        slab_obj_destroy(cache, obj, slab);
-
 
309
        return NULL;
-
 
310
    }
299
    return obj;
311
    return obj;
300
}
312
}
301
 
313
 
302
/**************************************/
314
/**************************************/
303
/* CPU-Cache slab functions */
315
/* CPU-Cache slab functions */
Line 529... Line 541...
529
_slab_cache_create(slab_cache_t *cache,
541
_slab_cache_create(slab_cache_t *cache,
530
           char *name,
542
           char *name,
531
           size_t size,
543
           size_t size,
532
           size_t align,
544
           size_t align,
533
           int (*constructor)(void *obj, int kmflag),
545
           int (*constructor)(void *obj, int kmflag),
534
           void (*destructor)(void *obj),
546
           int (*destructor)(void *obj),
535
           int flags)
547
           int flags)
536
{
548
{
537
    int i;
549
    int i;
538
    int pages;
550
    int pages;
539
    ipl_t ipl;
551
    ipl_t ipl;
Line 594... Line 606...
594
/** Create slab cache  */
606
/** Create slab cache  */
595
slab_cache_t * slab_cache_create(char *name,
607
slab_cache_t * slab_cache_create(char *name,
596
                 size_t size,
608
                 size_t size,
597
                 size_t align,
609
                 size_t align,
598
                 int (*constructor)(void *obj, int kmflag),
610
                 int (*constructor)(void *obj, int kmflag),
599
                 void (*destructor)(void *obj),
611
                 int (*destructor)(void *obj),
600
                 int flags)
612
                 int flags)
601
{
613
{
602
    slab_cache_t *cache;
614
    slab_cache_t *cache;
603
 
615
 
604
    cache = slab_alloc(&slab_cache_cache, 0);
616
    cache = slab_alloc(&slab_cache_cache, 0);