Add option to use "static" storage provided by the caller.
From Matthias Drochner.
This commit is contained in:
parent
6c6e9b4c1c
commit
201f7cf6b4
|
@ -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);
|
||||
|
|
|
@ -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_ */
|
||||
|
|
Loading…
Reference in New Issue