* Consequently propagate the CACHE_DONT_SLEEP flag.
* block_alloc(): Create B_FULL_LOCK area. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35202 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -95,7 +95,7 @@ HashedObjectCache::CreateSlab(uint32 flags, bool unlockWhileAllocating)
|
|||||||
|
|
||||||
void* pages;
|
void* pages;
|
||||||
if ((this->*allocate_pages)(&pages, flags, unlockWhileAllocating) == B_OK) {
|
if ((this->*allocate_pages)(&pages, flags, unlockWhileAllocating) == B_OK) {
|
||||||
if (InitSlab(slab, pages, slab_size))
|
if (InitSlab(slab, pages, slab_size, flags))
|
||||||
return slab;
|
return slab;
|
||||||
|
|
||||||
(this->*free_pages)(pages);
|
(this->*free_pages)(pages);
|
||||||
@@ -129,9 +129,9 @@ HashedObjectCache::ObjectSlab(void* object) const
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
HashedObjectCache::PrepareObject(slab* source, void* object)
|
HashedObjectCache::PrepareObject(slab* source, void* object, uint32 flags)
|
||||||
{
|
{
|
||||||
Link* link = _AllocateLink(CACHE_DONT_SLEEP);
|
Link* link = _AllocateLink(flags);
|
||||||
if (link == NULL)
|
if (link == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ struct HashedObjectCache : ObjectCache {
|
|||||||
virtual void ReturnSlab(slab* slab);
|
virtual void ReturnSlab(slab* slab);
|
||||||
virtual slab* ObjectSlab(void* object) const;
|
virtual slab* ObjectSlab(void* object) const;
|
||||||
|
|
||||||
virtual status_t PrepareObject(slab* source, void* object);
|
virtual status_t PrepareObject(slab* source, void* object,
|
||||||
|
uint32 flags);
|
||||||
virtual void UnprepareObject(slab* source, void* object);
|
virtual void UnprepareObject(slab* source, void* object);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ ObjectCache::Delete()
|
|||||||
|
|
||||||
|
|
||||||
slab*
|
slab*
|
||||||
ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount)
|
ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount, uint32 flags)
|
||||||
{
|
{
|
||||||
TRACE_CACHE(this, "construct (%p, %p .. %p, %lu)", slab, pages,
|
TRACE_CACHE(this, "construct (%p, %p .. %p, %lu)", slab, pages,
|
||||||
((uint8*)pages) + byteCount, byteCount);
|
((uint8*)pages) + byteCount, byteCount);
|
||||||
@@ -176,7 +176,7 @@ ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount)
|
|||||||
for (size_t i = 0; i < slab->size; i++) {
|
for (size_t i = 0; i < slab->size; i++) {
|
||||||
bool failedOnFirst = false;
|
bool failedOnFirst = false;
|
||||||
|
|
||||||
status_t status = PrepareObject(slab, data);
|
status_t status = PrepareObject(slab, data, flags);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
failedOnFirst = true;
|
failedOnFirst = true;
|
||||||
else if (constructor)
|
else if (constructor)
|
||||||
@@ -235,7 +235,7 @@ ObjectCache::UninitSlab(slab* slab)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
ObjectCache::PrepareObject(slab* source, void* object)
|
ObjectCache::PrepareObject(slab* source, void* object, uint32 flags)
|
||||||
{
|
{
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,10 +82,11 @@ public:
|
|||||||
virtual slab* ObjectSlab(void* object) const = 0;
|
virtual slab* ObjectSlab(void* object) const = 0;
|
||||||
|
|
||||||
slab* InitSlab(slab* slab, void* pages,
|
slab* InitSlab(slab* slab, void* pages,
|
||||||
size_t byteCount);
|
size_t byteCount, uint32 flags);
|
||||||
void UninitSlab(slab* slab);
|
void UninitSlab(slab* slab);
|
||||||
|
|
||||||
virtual status_t PrepareObject(slab* source, void* object);
|
virtual status_t PrepareObject(slab* source, void* object,
|
||||||
|
uint32 flags);
|
||||||
virtual void UnprepareObject(slab* source, void* object);
|
virtual void UnprepareObject(slab* source, void* object);
|
||||||
|
|
||||||
void ReturnObjectToSlab(slab* source, void* object);
|
void ReturnObjectToSlab(slab* source, void* object);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <int.h>
|
#include <int.h>
|
||||||
|
#include <slab/Slab.h>
|
||||||
#include <smp.h>
|
#include <smp.h>
|
||||||
#include <util/AutoLock.h>
|
#include <util/AutoLock.h>
|
||||||
|
|
||||||
@@ -79,7 +80,8 @@ static DepotMagazine*
|
|||||||
alloc_magazine()
|
alloc_magazine()
|
||||||
{
|
{
|
||||||
DepotMagazine* magazine = (DepotMagazine*)slab_internal_alloc(
|
DepotMagazine* magazine = (DepotMagazine*)slab_internal_alloc(
|
||||||
sizeof(DepotMagazine) + kMagazineCapacity * sizeof(void*), 0);
|
sizeof(DepotMagazine) + kMagazineCapacity * sizeof(void*),
|
||||||
|
CACHE_DONT_SLEEP);
|
||||||
if (magazine) {
|
if (magazine) {
|
||||||
magazine->next = NULL;
|
magazine->next = NULL;
|
||||||
magazine->current_round = 0;
|
magazine->current_round = 0;
|
||||||
|
|||||||
@@ -279,8 +279,7 @@ slab_internal_alloc(size_t size, uint32 flags)
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Support CACHE_DONT_SLEEP!
|
return block_alloc(size, flags);
|
||||||
return block_alloc(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ SmallObjectCache::CreateSlab(uint32 flags, bool unlockWhileAllocating)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return InitSlab(slab_in_pages(pages, slab_size), pages,
|
return InitSlab(slab_in_pages(pages, slab_size), pages,
|
||||||
slab_size - sizeof(slab));
|
slab_size - sizeof(slab), flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,16 @@
|
|||||||
* Hugo Santos, [email protected]
|
* Hugo Santos, [email protected]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <slab/Slab.h>
|
|
||||||
|
|
||||||
#include <kernel.h> // for ROUNDUP
|
#include "slab_private.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "slab_private.h"
|
#include <kernel.h> // for ROUNDUP
|
||||||
|
#include <slab/Slab.h>
|
||||||
|
#include <vm/vm.h>
|
||||||
|
#include <vm/VMAddressSpace.h>
|
||||||
|
|
||||||
|
|
||||||
#define DEBUG_ALLOCATOR
|
#define DEBUG_ALLOCATOR
|
||||||
@@ -74,7 +76,7 @@ size_to_index(size_t size)
|
|||||||
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
block_alloc(size_t size)
|
block_alloc(size_t size, uint32 flags)
|
||||||
{
|
{
|
||||||
int index = size_to_index(size + sizeof(boundary_tag));
|
int index = size_to_index(size + sizeof(boundary_tag));
|
||||||
|
|
||||||
@@ -83,10 +85,12 @@ block_alloc(size_t size)
|
|||||||
|
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
void *pages;
|
void *pages;
|
||||||
area_id area = create_area("alloc'ed block", &pages,
|
area_id area = create_area_etc(VMAddressSpace::KernelID(),
|
||||||
B_ANY_KERNEL_ADDRESS, ROUNDUP(size + sizeof(area_boundary_tag),
|
"alloc'ed block", &pages, B_ANY_KERNEL_ADDRESS,
|
||||||
B_PAGE_SIZE), B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
|
ROUNDUP(size + sizeof(area_boundary_tag), B_PAGE_SIZE), B_FULL_LOCK,
|
||||||
if (area < B_OK)
|
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, 0,
|
||||||
|
(flags & CACHE_DONT_SLEEP) != 0 ? CREATE_AREA_DONT_WAIT : 0);
|
||||||
|
if (area < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
area_boundary_tag *areaTag = (area_boundary_tag *)pages;
|
area_boundary_tag *areaTag = (area_boundary_tag *)pages;
|
||||||
@@ -94,7 +98,7 @@ block_alloc(size_t size)
|
|||||||
tag = &areaTag->tag;
|
tag = &areaTag->tag;
|
||||||
block = areaTag + 1;
|
block = areaTag + 1;
|
||||||
} else {
|
} else {
|
||||||
tag = (boundary_tag *)object_cache_alloc(sBlockCaches[index], 0);
|
tag = (boundary_tag *)object_cache_alloc(sBlockCaches[index], flags);
|
||||||
if (tag == NULL)
|
if (tag == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
atomic_add(&sBlockCacheWaste[index], kBlockSizes[index] - size
|
atomic_add(&sBlockCacheWaste[index], kBlockSizes[index] - size
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ struct ObjectCache;
|
|||||||
void* slab_internal_alloc(size_t size, uint32 flags);
|
void* slab_internal_alloc(size_t size, uint32 flags);
|
||||||
void slab_internal_free(void *_buffer);
|
void slab_internal_free(void *_buffer);
|
||||||
|
|
||||||
void* block_alloc(size_t size);
|
void* block_alloc(size_t size, uint32 flags);
|
||||||
void block_free(void *block);
|
void block_free(void *block);
|
||||||
void block_allocator_init_boot();
|
void block_allocator_init_boot();
|
||||||
void block_allocator_init_rest();
|
void block_allocator_init_rest();
|
||||||
|
|||||||
Reference in New Issue
Block a user