Add option to use "static" storage provided by the caller.

From Matthias Drochner.
This commit is contained in:
pk 1998-02-19 23:51:48 +00:00
parent 6c6e9b4c1c
commit 201f7cf6b4
2 changed files with 54 additions and 13 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_pool.c,v 1.1 1997/12/15 11:14:57 pk Exp $ */
/* $NetBSD: subr_pool.c,v 1.2 1998/02/19 23:52:14 pk Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@ -55,36 +55,45 @@ struct pool_item {
struct pool *
pool_create(size, nitems, wchan, mtype)
pool_create(size, nitems, wchan, mtype, storage)
size_t size;
int nitems;
char *wchan;
int mtype;
caddr_t storage;
{
struct pool *pp;
caddr_t cp;
if (size < sizeof(struct pool_item)) {
printf("pool_create: size %lu too small\n", (u_long)size);
return (NULL);
}
pp = (struct pool *)malloc(sizeof(*pp), mtype, M_NOWAIT);
if (pp == NULL)
return (NULL);
if (storage) {
pp = (struct pool *)storage;
cp = (caddr_t)ALIGN(pp + 1);
} else {
pp = (struct pool *)malloc(sizeof(*pp), mtype, M_NOWAIT);
if (pp == NULL)
return (NULL);
cp = NULL;
}
pp->pr_freelist = NULL;
pp->pr_freecount = 0;
pp->pr_hiwat = 0;
pp->pr_flags = 0;
pp->pr_flags = (storage ? PR_STATIC : 0);
pp->pr_size = size;
pp->pr_wchan = wchan;
pp->pr_mtype = mtype;
simple_lock_init(&pp->pr_lock);
if (nitems != 0) {
if (pool_prime(pp, nitems) != 0)
if (pool_prime(pp, nitems, cp) != 0) {
pool_destroy(pp);
return (NULL);
return (NULL);
}
}
return (pp);
@ -99,6 +108,9 @@ pool_destroy(pp)
{
struct pool_item *pi;
if (pp->pr_flags & PR_STATIC)
return;
while ((pi = pp->pr_freelist) != NULL) {
pp->pr_freelist = pi->pi_next;
free(pi, pp->pr_mtype);
@ -118,6 +130,11 @@ pool_get(pp, flags)
void *v;
struct pool_item *pi;
#ifdef DIAGNOSTIC
if ((pp->pr_flags & PR_STATIC) && (flags & PR_MALLOCOK))
panic("pool_get: static");
#endif
again:
simple_lock(&pp->pr_lock);
if ((v = pp->pr_freelist) == NULL) {
@ -162,6 +179,12 @@ pool_put(pp, v)
wakeup((caddr_t)pp);
}
} else {
#ifdef DIAGNOSTIC
if (pp->pr_flags & PR_STATIC) {
/* can't happen because hiwat > freecount */
panic("pool_put: static");
}
#endif
/* Return to system */
free(v, M_DEVBUF);
@ -183,16 +206,29 @@ pool_put(pp, v)
* Add N items to the pool
*/
int
pool_prime(pp, n)
pool_prime(pp, n, storage)
struct pool *pp;
int n;
caddr_t storage;
{
struct pool_item *pi;
caddr_t cp = storage;
#ifdef DIAGNOSTIC
if (storage && !(pp->pr_flags & PR_STATIC))
panic("pool_prime: static");
/* !storage && static caught below */
#endif
simple_lock(&pp->pr_lock);
pp->pr_hiwat += n;
while (n--) {
pi = malloc(pp->pr_size, pp->pr_mtype, M_NOWAIT);
if (pp->pr_flags & PR_STATIC) {
pi = (struct pool_item *)cp;
cp = (caddr_t)ALIGN(cp + pp->pr_size);
} else
pi = malloc(pp->pr_size, pp->pr_mtype, M_NOWAIT);
if (pi == NULL) {
simple_unlock(&pp->pr_lock);
return (ENOMEM);

View File

@ -1,4 +1,4 @@
/* $NetBSD: pool.h,v 1.2 1998/02/10 00:25:41 perry Exp $ */
/* $NetBSD: pool.h,v 1.3 1998/02/19 23:51:48 pk Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@ -50,13 +50,18 @@ typedef struct pool {
#define PR_MALLOCOK 1
#define PR_WAITOK 2
#define PR_WANTED 4
#define PR_STATIC 8
struct simplelock pr_lock;
} *pool_handle_t;
pool_handle_t pool_create __P((size_t, int, char *, int));
pool_handle_t pool_create __P((size_t, int, char *, int, caddr_t));
void pool_destroy __P((pool_handle_t));
void *pool_get __P((pool_handle_t, int));
void pool_put __P((pool_handle_t, void *));
int pool_prime __P((pool_handle_t, int));
int pool_prime __P((pool_handle_t, int, caddr_t));
#define POOL_ITEM_STORAGE_SIZE(size, nitems) (ALIGN(size) * nitems)
#define POOL_STORAGE_SIZE(size, nitems) \
(ALIGN(sizeof(struct pool)) + POOL_ITEM_STORAGE_SIZE(size, nitems))
#endif /* _SYS_POOL_H_ */