summaryrefslogtreecommitdiff
path: root/libhurd-slab
diff options
context:
space:
mode:
authormarcus <marcus>2003-10-11 22:08:48 +0000
committermarcus <marcus>2003-10-11 22:08:48 +0000
commit0e7403903e8d919a340c63acf5decf334c86c4b8 (patch)
tree4cf4101bf7e64d6b3342a4285b363e3b70792746 /libhurd-slab
parent6bf12244fbb6f2d05f79d8a2143d1c142f29198c (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/ChangeLog12
-rw-r--r--libhurd-slab/slab.c15
-rw-r--r--libhurd-slab/slab.h14
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. */