PageCache-Object

Offers object and interface for allocating pages of memory.

Do not use the interface directly instead include PageCacheMacros.

Summary
PageCache-ObjectOffers object and interface for allocating pages of memory.
CopyrightThis program is free software.
Files
C-kern/api/memory/pagecache.hHeader file PageCache-Object.
C-kern/memory/pagecache.cImplementation file PageCache-Object impl.
Types
struct pagecache_tExport pagecache_t into global namespace.
struct pagecache_itExport pagecache_it into global namespace.
Enumerations
pagesize_eList of supported page sizes.
Functions
test
unittest_memory_pagecacheTest functionality of pagecache_t and pagecache_it.
pagecache_tUses iobj_DECLARE to declare interfaceable object.
lifetime
pagecache_FREEStatic initializer.
pagecache_INITStatic initializer.
query
isobject_pagecacheReturns true if member <pagecache_t.object> of pgcache is not null.
call
allocpage_pagecacheCalls pgcache->iimpl->allocpage with pgcache->object as first parameter.
releasepage_pagecacheCalls pgcache->iimpl->releasepage with pgcache->object as first parameter.
sizeallocated_pagecacheCalls pgcache->iimpl->sizeallocated with pgcache->object as first parameter.
allocstatic_pagecacheCalls pgcache->iimpl->allocstatic with pgcache->object as first parameter.
freestatic_pagecacheCalls pgcache->iimpl->freestatic with pgcache->object as first parameter.
sizestatic_pagecacheCalls pgcache->iimpl->sizestatic with pgcache->object as first parameter.
emptycache_pagecacheCalls pgcache->iimpl->emptycache with pgcache->object as first parameter.
pagecache_itInterface which allows to allocate and relase pages of memory.
allocpageAllocates a single memory page of size pgsize.
releasepageReleases a single memory page.
sizeallocatedReturns the sum of the size of all allocated pages.
allocstaticAllocates static memory which should live as long as pgcache.
freestaticFrees static memory.
sizestaticSize of memory allocated with allocstatic.
emptycacheReleases all unused memory blocks back to the operating system.
lifetime
pagecache_it_FREEStatic initializer.
pagecache_it_INITStatic initializer.
query
pagesizeinbytes_pagecacheitTranslates enum pagesize_e into size in bytes.
generic
genericcast_pagecacheitCasts pointer pgcacheif into pointer to interface pagecache_it.
pagecache_it_DECLAREDeclares an interface function table for accessing pagecache.
inline implementation
pagecache_t
allocpage_pagecacheImplements pagecache_t.allocpage_pagecache.
allocstatic_pagecacheImplements pagecache_t.allocstatic_pagecache.
freestatic_pagecacheImplements pagecache_t.freestatic_pagecache.
isobject_pagecacheImplements pagecache_t.isobject_pagecache.
emptycache_pagecacheImplements pagecache_t.emptycache_pagecache.
releasepage_pagecacheImplements pagecache_t.releasepage_pagecache.
sizeallocated_pagecacheImplements pagecache_t.sizeallocated_pagecache.
sizestatic_pagecacheImplements pagecache_t.sizestatic_pagecache.
pagecache_it
genericcast_pagecacheitImplements pagecache_it.genericcast_pagecacheit.
pagecache_it_DECLAREImplements pagecache_it.pagecache_it_DECLARE.
pagesizeinbytes_pagecacheitImplements pagecache_it.pagesizeinbytes_pagecacheit.

Copyright

This program is free software.  You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

Author

© 2013 Jörg Seebohn

Files

C-kern/api/memory/pagecache.h

Header file PageCache-Object.

C-kern/memory/pagecache.c

Implementation file PageCache-Object impl.

Types

struct pagecache_t

typedef struct pagecache_t pagecache_t

Export pagecache_t into global namespace.

struct pagecache_it

typedef struct pagecache_it pagecache_it

Export pagecache_it into global namespace.

Enumerations

pagesize_e

List of supported page sizes. pagesize_256 - Request page size of 256 byte aligned to a 256 byte boundary. pagesize_1024 - Request page size of 1024 byte aligned to a 1024 byte boundary. pagesize_4096 - Request page size of 4096 byte aligned to a 4096 byte boundary. pagesize_16384 - Request page size of 16384 byte aligned to a 16384 byte boundary. pagesize_65536 - Request page size of 65536 byte aligned to a 65536 byte boundary. pagesize_1MB - Request page size of 1024*1024 byte aligned to a 1MB byte boundary.

Functions

Summary

test

unittest_memory_pagecache

int unittest_memory_pagecache(void)

Test functionality of pagecache_t and pagecache_it.

pagecache_t

iobj_DECLARE(pagecache_t,
pagecache)

Uses iobj_DECLARE to declare interfaceable object.  See also pagecache_impl_t which is the default implementation.

Summary
lifetime
pagecache_FREEStatic initializer.
pagecache_INITStatic initializer.
query
isobject_pagecacheReturns true if member <pagecache_t.object> of pgcache is not null.
call
allocpage_pagecacheCalls pgcache->iimpl->allocpage with pgcache->object as first parameter.
releasepage_pagecacheCalls pgcache->iimpl->releasepage with pgcache->object as first parameter.
sizeallocated_pagecacheCalls pgcache->iimpl->sizeallocated with pgcache->object as first parameter.
allocstatic_pagecacheCalls pgcache->iimpl->allocstatic with pgcache->object as first parameter.
freestatic_pagecacheCalls pgcache->iimpl->freestatic with pgcache->object as first parameter.
sizestatic_pagecacheCalls pgcache->iimpl->sizestatic with pgcache->object as first parameter.
emptycache_pagecacheCalls pgcache->iimpl->emptycache with pgcache->object as first parameter.

lifetime

pagecache_FREE

#define pagecache_FREE iobj_FREE

Static initializer.  See <iobj_FREE>.

pagecache_INIT

#define pagecache_INIT(object,
iimpl) iobj_INIT(object, iimpl)

Static initializer.  See <iobj_INIT>.

query

isobject_pagecache

bool isobject_pagecache(const pagecache_t *pgcache)

Returns true if member <pagecache_t.object> of pgcache is not null.

call

allocpage_pagecache

int allocpage_pagecache(const pagecache_t pgcache,
uint8_t pgsize,
/*out*/struct memblock_t *page)

Calls pgcache->iimpl->allocpage with pgcache->object as first parameter.  See pagecache_it.allocpage.

releasepage_pagecache

int releasepage_pagecache(const pagecache_t pgcache,
struct memblock_t *page)

Calls pgcache->iimpl->releasepage with pgcache->object as first parameter.  See pagecache_it.releasepage.

sizeallocated_pagecache

size_t sizeallocated_pagecache(const pagecache_t pgcache)

Calls pgcache->iimpl->sizeallocated with pgcache->object as first parameter.  See pagecache_it.sizeallocated.

allocstatic_pagecache

int allocstatic_pagecache(const pagecache_t pgcache,
size_t bytesize,
/*out*/struct memblock_t *memblock)

Calls pgcache->iimpl->allocstatic with pgcache->object as first parameter.  See pagecache_it.allocstatic.

freestatic_pagecache

int freestatic_pagecache(const pagecache_t pgcache,
struct memblock_t *memblock)

Calls pgcache->iimpl->freestatic with pgcache->object as first parameter.  See pagecache_it.freestatic.

sizestatic_pagecache

size_t sizestatic_pagecache(const pagecache_t pgcache)

Calls pgcache->iimpl->sizestatic with pgcache->object as first parameter.  See pagecache_it.sizestatic.

emptycache_pagecache

int emptycache_pagecache(const pagecache_t pgcache)

Calls pgcache->iimpl->emptycache with pgcache->object as first parameter.  See pagecache_it.emptycache.

pagecache_it

struct pagecache_it

Interface which allows to allocate and relase pages of memory.

Summary
allocpageAllocates a single memory page of size pgsize.
releasepageReleases a single memory page.
sizeallocatedReturns the sum of the size of all allocated pages.
allocstaticAllocates static memory which should live as long as pgcache.
freestaticFrees static memory.
sizestaticSize of memory allocated with allocstatic.
emptycacheReleases all unused memory blocks back to the operating system.
lifetime
pagecache_it_FREEStatic initializer.
pagecache_it_INITStatic initializer.
query
pagesizeinbytes_pagecacheitTranslates enum pagesize_e into size in bytes.
generic
genericcast_pagecacheitCasts pointer pgcacheif into pointer to interface pagecache_it.
pagecache_it_DECLAREDeclares an interface function table for accessing pagecache.

allocpage

int (
   *allocpage
) (pagecache_t * pgcache, uint8_t pgsize, /*out*/struct memblock_t * page)

Allocates a single memory page of size pgsize.  The page is aligned to its own size. pgsize must be a value from pagesize_e.

releasepage

int (*releasepage) (pagecache_t * pgcache, struct memblock_t * page)

Releases a single memory page.  It is kept in the cache and only returned to the operating system if a big chunk of memory is not in use.  After return page is set to <memblock_FREE>.  Calling this function with page set to <memblock_FREE> does nothing.

sizeallocated

size_t (*sizeallocated) (const pagecache_t * pgcache)

Returns the sum of the size of all allocated pages.

allocstatic

int (
   *allocstatic
) (pagecache_t * pgcache, size_t bytesize, /*out*/struct memblock_t * memblock)

Allocates static memory which should live as long as pgcache.  These blocks can only be freed by freeing pgcache.  The size of memory is set in bytes with parameter bytesize.  The allocated memory block (aligned to KONFIG_MEMALIGN) is returned in memblock.  In case of no memory ENOMEM is returned.  The size of the block if restricted to 128 bytes.

freestatic

int (*freestatic) (pagecache_t * pgcache, struct memblock_t * memblock)

Frees static memory.  If this function is not called in the reverse order of the call sequence of <allocstatic_pagecacheimpl> the value EINVAL is returned and nothing is done.  After return memblock is set to <memblock_FREE>.  Calling this function with memblock set to <memblock_FREE> does nothing.

sizestatic

size_t (*sizestatic) (const pagecache_t * pgcache)

Size of memory allocated with allocstatic.

emptycache

int (*emptycache) (pagecache_t * pgcache)

Releases all unused memory blocks back to the operating system.

lifetime

pagecache_it_FREE

#define pagecache_it_FREE { 0, 0, 0, 0, 0, 0, 0 }

Static initializer.

pagecache_it_INIT

#define pagecache_it_INIT(
   allocpage_f,
   releasepage_f,
   sizeallocated_f,
   allocstatic_f,
   sizestatic_f,
   freestatic_f,
   emptycache_f
) { (allocpage_f), (releasepage_f), (sizeallocated_f), (allocstatic_f), (sizestatic_f), (freestatic_f), (emptycache_f) }

Static initializer.  Set all function pointers to the provided values.

Parameters

allocpage_fFunction pointer to allocate memory pages.  See pagecache_it.allocpage.
releasepage_fFunction pointer to release memory pages.  See pagecache_it.releasepage.
sizeallocated_fFunction pointer to query the sum of the size of all allocated memory page.  See pagecache_it.sizeallocated.
allocstatic_fFunction pointer to allocate static blocks of memory.  See pagecache_it.allocstatic.
freestatic_fFunction pointer to free static blocks of memory.  See pagecache_it.freestatic.
sizestatic_fFunction pointer to query size of static allocated memory.  See pagecache_it.sizestatic.
emptycache_fFunction pointer to return unused memory blocks back to the OS.  See pagecache_it.emptycache.

query

pagesizeinbytes_pagecacheit

size_t pagesizeinbytes_pagecacheit(pagesize_e pagesize)

Translates enum pagesize_e into size in bytes.

Precondition

  • pagesize is a value out of pagesize_e else an invalid value is returned.

generic

genericcast_pagecacheit

pagecache_it * genericcast_pagecacheit(void *pgcacheif,
TYPENAME pagecache_t)

Casts pointer pgcacheif into pointer to interface pagecache_it.  Parameter pgcacheif must point to a type declared with pagecache_it_DECLARE.  The other parameters must be the same as in pagecache_it_DECLARE without the first.

pagecache_it_DECLARE

void pagecache_it_DECLARE(TYPENAME declared_it,
TYPENAME pagecache_t)

Declares an interface function table for accessing pagecache.  The declared interface is structural compatible with pagecache_it.  The difference between the newly declared interface and the generic interface is the type of the first parameter.

See pagecache_it for a list of declared functions.

Parameter

declared_itThe name of the structure which is declared as the interface.  The name should have the suffix “_it”.
pagecache_tThe type of the pagecache object which is the first parameter of all interface functions.

pagecache_t

allocpage_pagecache

#define allocpage_pagecache(
   pgcache,
   pgsize,
   page
) ((pgcache).iimpl->allocpage((pgcache).object, (pgsize), (page)))

Implements pagecache_t.allocpage_pagecache.

allocstatic_pagecache

#define allocstatic_pagecache(
   pgcache,
   bytesize,
   memblock
) ((pgcache).iimpl->allocstatic((pgcache).object, (bytesize), (memblock)))

Implements pagecache_t.allocstatic_pagecache.

freestatic_pagecache

#define freestatic_pagecache(
   pgcache,
   memblock
) ((pgcache).iimpl->freestatic((pgcache).object, (memblock)))

Implements pagecache_t.freestatic_pagecache.

isobject_pagecache

#define isobject_pagecache(pgcache) (0 != (pgcache)->object)

Implements pagecache_t.isobject_pagecache.

emptycache_pagecache

#define emptycache_pagecache(
   pgcache
) ((pgcache).iimpl->emptycache((pgcache).object))

Implements pagecache_t.emptycache_pagecache.

releasepage_pagecache

#define releasepage_pagecache(
   pgcache,
   page
) ((pgcache).iimpl->releasepage((pgcache).object, (page)))

Implements pagecache_t.releasepage_pagecache.

sizeallocated_pagecache

#define sizeallocated_pagecache(
   pgcache
) ((pgcache).iimpl->sizeallocated((pgcache).object))

Implements pagecache_t.sizeallocated_pagecache.

sizestatic_pagecache

#define sizestatic_pagecache(
   pgcache
) ((pgcache).iimpl->sizestatic((pgcache).object))

Implements pagecache_t.sizestatic_pagecache.

pagecache_it

genericcast_pagecacheit

#define genericcast_pagecacheit(
   pgcacheif,
   pagecache_t
) ( __extension__ ({ static_assert( offsetof(typeof(*(pgcacheif)), allocpage) == offsetof(pagecache_it, allocpage) && offsetof(typeof(*(pgcacheif)), releasepage) == offsetof(pagecache_it, releasepage) && offsetof(typeof(*(pgcacheif)), sizeallocated) == offsetof(pagecache_it, sizeallocated) && offsetof(typeof(*(pgcacheif)), allocstatic) == offsetof(pagecache_it, allocstatic) && offsetof(typeof(*(pgcacheif)), freestatic) == offsetof(pagecache_it, freestatic) && offsetof(typeof(*(pgcacheif)), sizestatic) == offsetof(pagecache_it, sizestatic) && sizeof(int) == sizeof((pgcacheif)->allocpage( (pagecache_t*)0, pagesize_16384, (struct memblock_t*)0)) && sizeof(int) == sizeof((pgcacheif)->releasepage( (pagecache_t*)0, (struct memblock_t*)0)) && sizeof(size_t) == sizeof((pgcacheif)->sizeallocated( (const pagecache_t*)0)) && sizeof(int) == sizeof((pgcacheif)->allocstatic( (pagecache_t*)0, (size_t)0, (struct memblock_t*)0)) && sizeof(int) == sizeof((pgcacheif)->freestatic( (pagecache_t*)0, (struct memblock_t*)0)) && sizeof(size_t) == sizeof((pgcacheif)->sizestatic( (const pagecache_t*)0)) && sizeof(int) == sizeof((pgcacheif)->emptycache( (pagecache_t*)0)), "ensure same structure") ; if (0) { int _err ; size_t _err2 ; _err = (pgcacheif)->allocpage( (pagecache_t*)0, pagesize_16384, (struct memblock_t*)0) ; _err += (pgcacheif)->releasepage( (pagecache_t*)0, (struct memblock_t*)0) ; _err2 = (pgcacheif)->sizeallocated( (const pagecache_t*)0) ; _err += (pgcacheif)->allocstatic( (pagecache_t*)0, (size_t)128, (struct memblock_t *)0) ; _err += (pgcacheif)->freestatic( (pagecache_t*)0, (struct memblock_t *)0) ; _err2 += (pgcacheif)->sizestatic( (const pagecache_t*)0) ; _err += (pgcacheif)->emptycache( (pagecache_t*)0) ; _err2 += (size_t)_err ; (void) _err2 ; } (pagecache_it*) (pgcacheif) ; }))

Implements pagecache_it.genericcast_pagecacheit.

pagecache_it_DECLARE

#define pagecache_it_DECLARE(
   declared_it,
   pagecache_t
) typedef struct declared_it declared_it ; struct declared_it { int (*allocpage) (pagecache_t * pgcache, uint8_t pgsize, /*out*/struct memblock_t * page) ; int (*releasepage) (pagecache_t * pgcache, struct memblock_t * page) ; size_t (*sizeallocated) (const pagecache_t * pgcache) ; int (*allocstatic) (pagecache_t * pgcache, size_t bytesize, /*out*/struct memblock_t * memblock) ; int (*freestatic) (pagecache_t * pgcache, struct memblock_t * memblock) ; size_t (*sizestatic) (const pagecache_t * pgcache) ; int (*emptycache) (pagecache_t * pgcache) ; } ;

Implements pagecache_it.pagecache_it_DECLARE.

pagesizeinbytes_pagecacheit

Offers object and interface for allocating pages of memory.
Implements PageCache-Object.
typedef struct pagecache_t pagecache_t
Export pagecache_t into global namespace.
iobj_DECLARE(pagecache_t,
pagecache)
Uses iobj_DECLARE to declare interfaceable object.
typedef struct pagecache_it pagecache_it
Export pagecache_it into global namespace.
struct pagecache_it
Interface which allows to allocate and relase pages of memory.
int unittest_memory_pagecache(void)
Test functionality of pagecache_t and pagecache_it.
#define iobj_DECLARE(
   declared_t,
   typenameprefix
) struct declared_t { struct typenameprefix##_t * object ; struct typenameprefix##_it * iimpl ; }
Implements iobj_t.iobj_DECLARE.
#define pagecache_FREE iobj_FREE
Static initializer.
#define pagecache_INIT(object,
iimpl) iobj_INIT(object, iimpl)
Static initializer.
bool isobject_pagecache(const pagecache_t *pgcache)
Returns true if member pagecache_t.object of pgcache is not null.
int allocpage_pagecache(const pagecache_t pgcache,
uint8_t pgsize,
/*out*/struct memblock_t *page)
Calls pgcache->iimpl->allocpage with pgcache->object as first parameter.
int releasepage_pagecache(const pagecache_t pgcache,
struct memblock_t *page)
Calls pgcache->iimpl->releasepage with pgcache->object as first parameter.
size_t sizeallocated_pagecache(const pagecache_t pgcache)
Calls pgcache->iimpl->sizeallocated with pgcache->object as first parameter.
int allocstatic_pagecache(const pagecache_t pgcache,
size_t bytesize,
/*out*/struct memblock_t *memblock)
Calls pgcache->iimpl->allocstatic with pgcache->object as first parameter.
int freestatic_pagecache(const pagecache_t pgcache,
struct memblock_t *memblock)
Calls pgcache->iimpl->freestatic with pgcache->object as first parameter.
size_t sizestatic_pagecache(const pagecache_t pgcache)
Calls pgcache->iimpl->sizestatic with pgcache->object as first parameter.
int emptycache_pagecache(const pagecache_t pgcache)
Calls pgcache->iimpl->emptycache with pgcache->object as first parameter.
int (
   *allocpage
) (pagecache_t * pgcache, uint8_t pgsize, /*out*/struct memblock_t * page)
Allocates a single memory page of size pgsize.
int (*releasepage) (pagecache_t * pgcache, struct memblock_t * page)
Releases a single memory page.
size_t (*sizeallocated) (const pagecache_t * pgcache)
Returns the sum of the size of all allocated pages.
int (
   *allocstatic
) (pagecache_t * pgcache, size_t bytesize, /*out*/struct memblock_t * memblock)
Allocates static memory which should live as long as pgcache.
int (*freestatic) (pagecache_t * pgcache, struct memblock_t * memblock)
Frees static memory.
size_t (*sizestatic) (const pagecache_t * pgcache)
Size of memory allocated with allocstatic.
int (*emptycache) (pagecache_t * pgcache)
Releases all unused memory blocks back to the operating system.
#define pagecache_it_FREE { 0, 0, 0, 0, 0, 0, 0 }
Static initializer.
#define pagecache_it_INIT(
   allocpage_f,
   releasepage_f,
   sizeallocated_f,
   allocstatic_f,
   sizestatic_f,
   freestatic_f,
   emptycache_f
) { (allocpage_f), (releasepage_f), (sizeallocated_f), (allocstatic_f), (sizestatic_f), (freestatic_f), (emptycache_f) }
Static initializer.
size_t pagesizeinbytes_pagecacheit(pagesize_e pagesize)
Translates enum pagesize_e into size in bytes.
List of supported page sizes.
pagecache_it * genericcast_pagecacheit(void *pgcacheif,
TYPENAME pagecache_t)
Casts pointer pgcacheif into pointer to interface pagecache_it.
void pagecache_it_DECLARE(TYPENAME declared_it,
TYPENAME pagecache_t)
Declares an interface function table for accessing pagecache.
#define allocpage_pagecache(
   pgcache,
   pgsize,
   page
) ((pgcache).iimpl->allocpage((pgcache).object, (pgsize), (page)))
Implements pagecache_t.allocpage_pagecache.
#define allocstatic_pagecache(
   pgcache,
   bytesize,
   memblock
) ((pgcache).iimpl->allocstatic((pgcache).object, (bytesize), (memblock)))
Implements pagecache_t.allocstatic_pagecache.
#define freestatic_pagecache(
   pgcache,
   memblock
) ((pgcache).iimpl->freestatic((pgcache).object, (memblock)))
Implements pagecache_t.freestatic_pagecache.
#define isobject_pagecache(pgcache) (0 != (pgcache)->object)
Implements pagecache_t.isobject_pagecache.
#define emptycache_pagecache(
   pgcache
) ((pgcache).iimpl->emptycache((pgcache).object))
Implements pagecache_t.emptycache_pagecache.
#define releasepage_pagecache(
   pgcache,
   page
) ((pgcache).iimpl->releasepage((pgcache).object, (page)))
Implements pagecache_t.releasepage_pagecache.
#define sizeallocated_pagecache(
   pgcache
) ((pgcache).iimpl->sizeallocated((pgcache).object))
Implements pagecache_t.sizeallocated_pagecache.
#define sizestatic_pagecache(
   pgcache
) ((pgcache).iimpl->sizestatic((pgcache).object))
Implements pagecache_t.sizestatic_pagecache.
#define genericcast_pagecacheit(
   pgcacheif,
   pagecache_t
) ( __extension__ ({ static_assert( offsetof(typeof(*(pgcacheif)), allocpage) == offsetof(pagecache_it, allocpage) && offsetof(typeof(*(pgcacheif)), releasepage) == offsetof(pagecache_it, releasepage) && offsetof(typeof(*(pgcacheif)), sizeallocated) == offsetof(pagecache_it, sizeallocated) && offsetof(typeof(*(pgcacheif)), allocstatic) == offsetof(pagecache_it, allocstatic) && offsetof(typeof(*(pgcacheif)), freestatic) == offsetof(pagecache_it, freestatic) && offsetof(typeof(*(pgcacheif)), sizestatic) == offsetof(pagecache_it, sizestatic) && sizeof(int) == sizeof((pgcacheif)->allocpage( (pagecache_t*)0, pagesize_16384, (struct memblock_t*)0)) && sizeof(int) == sizeof((pgcacheif)->releasepage( (pagecache_t*)0, (struct memblock_t*)0)) && sizeof(size_t) == sizeof((pgcacheif)->sizeallocated( (const pagecache_t*)0)) && sizeof(int) == sizeof((pgcacheif)->allocstatic( (pagecache_t*)0, (size_t)0, (struct memblock_t*)0)) && sizeof(int) == sizeof((pgcacheif)->freestatic( (pagecache_t*)0, (struct memblock_t*)0)) && sizeof(size_t) == sizeof((pgcacheif)->sizestatic( (const pagecache_t*)0)) && sizeof(int) == sizeof((pgcacheif)->emptycache( (pagecache_t*)0)), "ensure same structure") ; if (0) { int _err ; size_t _err2 ; _err = (pgcacheif)->allocpage( (pagecache_t*)0, pagesize_16384, (struct memblock_t*)0) ; _err += (pgcacheif)->releasepage( (pagecache_t*)0, (struct memblock_t*)0) ; _err2 = (pgcacheif)->sizeallocated( (const pagecache_t*)0) ; _err += (pgcacheif)->allocstatic( (pagecache_t*)0, (size_t)128, (struct memblock_t *)0) ; _err += (pgcacheif)->freestatic( (pagecache_t*)0, (struct memblock_t *)0) ; _err2 += (pgcacheif)->sizestatic( (const pagecache_t*)0) ; _err += (pgcacheif)->emptycache( (pagecache_t*)0) ; _err2 += (size_t)_err ; (void) _err2 ; } (pagecache_it*) (pgcacheif) ; }))
Implements pagecache_it.genericcast_pagecacheit.
#define pagecache_it_DECLARE(
   declared_it,
   pagecache_t
) typedef struct declared_it declared_it ; struct declared_it { int (*allocpage) (pagecache_t * pgcache, uint8_t pgsize, /*out*/struct memblock_t * page) ; int (*releasepage) (pagecache_t * pgcache, struct memblock_t * page) ; size_t (*sizeallocated) (const pagecache_t * pgcache) ; int (*allocstatic) (pagecache_t * pgcache, size_t bytesize, /*out*/struct memblock_t * memblock) ; int (*freestatic) (pagecache_t * pgcache, struct memblock_t * memblock) ; size_t (*sizestatic) (const pagecache_t * pgcache) ; int (*emptycache) (pagecache_t * pgcache) ; } ;
Implements pagecache_it.pagecache_it_DECLARE.
Define macros to access thread local object of type pagecache_t storead in threadcontext_t.
struct pagecache_impl_t
Allocates and frees virtual memory pages and caches them.
#define KONFIG_MEMALIGN 4
Alignment of allocated memory.
Close