diff options
author | marcus <marcus> | 2003-10-11 22:08:48 +0000 |
---|---|---|
committer | marcus <marcus> | 2003-10-11 22:08:48 +0000 |
commit | 0e7403903e8d919a340c63acf5decf334c86c4b8 (patch) | |
tree | 4cf4101bf7e64d6b3342a4285b363e3b70792746 /libhurd-slab | |
parent | 6bf12244fbb6f2d05f79d8a2143d1c142f29198c (diff) |
2003-10-11 Marcus Brinkmann <marcus@gnu.org>
* slab.h (hurd_slab_constructor_t): Add new HOOK argument.
(hurd_slab_destructor_t): Likewise.
(hurd_slab_create): Likewise.
* slab.c (struct hurd_slab_space): New member HOOK. Move member
LOCK to beginning of struct.
(grow): Call constructor with hook value.
(reap): Call destructor with hook value.
(hurd_slab_create): Add argument HOOK, initialize (*SPACE)->hook.
Diffstat (limited to 'libhurd-slab')
-rw-r--r-- | libhurd-slab/ChangeLog | 12 | ||||
-rw-r--r-- | libhurd-slab/slab.c | 15 | ||||
-rw-r--r-- | libhurd-slab/slab.h | 14 |
3 files changed, 34 insertions, 7 deletions
diff --git a/libhurd-slab/ChangeLog b/libhurd-slab/ChangeLog index 3f43903..c76bb21 100644 --- a/libhurd-slab/ChangeLog +++ b/libhurd-slab/ChangeLog @@ -1,3 +1,15 @@ +2003-10-11 Marcus Brinkmann <marcus@gnu.org> + + * slab.h (hurd_slab_constructor_t): Add new HOOK argument. + (hurd_slab_destructor_t): Likewise. + (hurd_slab_create): Likewise. + * slab.c (struct hurd_slab_space): New member HOOK. Move member + LOCK to beginning of struct. + (grow): Call constructor with hook value. + (reap): Call destructor with hook value. + (hurd_slab_create): Add argument HOOK, initialize (*SPACE)->hook. + + 2003-09-17 Johan Rydberg <jrydberg@night.trouble.net> * slab.h: Add alignment argument. diff --git a/libhurd-slab/slab.c b/libhurd-slab/slab.c index 6574bdf..3005467 100644 --- a/libhurd-slab/slab.c +++ b/libhurd-slab/slab.c @@ -74,6 +74,9 @@ struct hurd_slab /* The type of a slab space. */ struct hurd_slab_space { + /* Protects this structure, along with all the slabs. */ + pthread_mutex_t lock; + struct hurd_slab *slab_first; struct hurd_slab *slab_last; @@ -97,11 +100,11 @@ struct hurd_slab_space /* The constructor. */ hurd_slab_constructor_t constructor; - /* Protects this structure, along with all the slabs. */ - pthread_mutex_t lock; - /* The destructor. */ hurd_slab_destructor_t destructor; + + /* The user's private data. */ + void *hook; }; @@ -175,7 +178,7 @@ reap (struct hurd_slab_space *space) { void *buffer = (((void *) bufctl) - (space->size - sizeof *bufctl)); - (*space->destructor) (buffer); + (*space->destructor) (space->hook, buffer); } } /* The slab is located at the end of the page (with the buffers @@ -252,7 +255,7 @@ grow (struct hurd_slab_space *space) /* Invoke constructor at object creation time, not when it is really allocated (for faster allocation). */ if (space->constructor) - (*space->constructor) (p); + (*space->constructor) (space->hook, p); /* The most activity is in front of the object, so it is most likely to be overwritten if a freed buffer gets accessed. @@ -293,6 +296,7 @@ error_t hurd_slab_create (size_t size, size_t alignment, hurd_slab_constructor_t constructor, hurd_slab_destructor_t destructor, + void *hook, hurd_slab_space_t *space) { error_t err; @@ -326,6 +330,7 @@ hurd_slab_create (size_t size, size_t alignment, (*space)->constructor = constructor; (*space)->destructor = destructor; + (*space)->hook = hook; /* Calculate the number of objects that fit in a slab. */ (*space)->full_refcount diff --git a/libhurd-slab/slab.h b/libhurd-slab/slab.h index 3a6b547..3336f9a 100644 --- a/libhurd-slab/slab.h +++ b/libhurd-slab/slab.h @@ -29,17 +29,27 @@ struct hurd_slab_space; typedef struct hurd_slab_space *hurd_slab_space_t; +/* Initialize the slab object pointed to by BUFFER. HOOK is as + provided to hurd_slab_create. */ +typedef error_t (*hurd_slab_constructor_t) (void *hook, void *buffer); + +/* Destroy the slab object pointed to by BUFFER. HOOK is as provided + to hurd_slab_create. */ +typedef void (*hurd_slab_destructor_t) (void *hook, void *buffer); /* Initialize the slab object pointed to by BUFFER. */ typedef error_t (*hurd_slab_constructor_t) (void *buffer); /* Destroy the slab object pointed to by BUFFER. */ typedef void (*hurd_slab_destructor_t) (void *buffer); -/* Create a new slab space with the given object size, alignment, - constructor and destructor. ALIGNMENT can be zero. */ + +/* Create a new slab space with the given object size, alignment, + constructor and destructor. ALIGNMENT can be zero. HOOK is passed + as the first argument to the constructor and destructor. */ error_t hurd_slab_create (size_t size, size_t alignment, hurd_slab_constructor_t constructor, hurd_slab_destructor_t destructor, + void *hook, hurd_slab_space_t *space); /* Allocate a new object from the slab space SPACE. */ |