[BACK]Return to subr_pool.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/subr_pool.c between version 1.1 and 1.2

version 1.1, 1997/12/15 11:14:57 version 1.2, 1998/02/19 23:52:14
Line 55  struct pool_item {
Line 55  struct pool_item {
   
   
 struct pool *  struct pool *
 pool_create(size, nitems, wchan, mtype)  pool_create(size, nitems, wchan, mtype, storage)
         size_t  size;          size_t  size;
         int     nitems;          int     nitems;
         char    *wchan;          char    *wchan;
         int     mtype;          int     mtype;
           caddr_t storage;
 {  {
         struct pool *pp;          struct pool *pp;
           caddr_t cp;
   
         if (size < sizeof(struct pool_item)) {          if (size < sizeof(struct pool_item)) {
                 printf("pool_create: size %lu too small\n", (u_long)size);                  printf("pool_create: size %lu too small\n", (u_long)size);
                 return (NULL);                  return (NULL);
         }          }
   
         pp = (struct pool *)malloc(sizeof(*pp), mtype, M_NOWAIT);          if (storage) {
         if (pp == NULL)                  pp = (struct pool *)storage;
                 return (NULL);                  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_freelist = NULL;
         pp->pr_freecount = 0;          pp->pr_freecount = 0;
         pp->pr_hiwat = 0;          pp->pr_hiwat = 0;
         pp->pr_flags = 0;          pp->pr_flags = (storage ? PR_STATIC : 0);
         pp->pr_size = size;          pp->pr_size = size;
         pp->pr_wchan = wchan;          pp->pr_wchan = wchan;
         pp->pr_mtype = mtype;          pp->pr_mtype = mtype;
         simple_lock_init(&pp->pr_lock);          simple_lock_init(&pp->pr_lock);
   
         if (nitems != 0) {          if (nitems != 0) {
                 if (pool_prime(pp, nitems) != 0)                  if (pool_prime(pp, nitems, cp) != 0) {
                         pool_destroy(pp);                          pool_destroy(pp);
                 return (NULL);                          return (NULL);
                   }
         }          }
   
         return (pp);          return (pp);
Line 99  pool_destroy(pp)
Line 108  pool_destroy(pp)
 {  {
         struct pool_item *pi;          struct pool_item *pi;
   
           if (pp->pr_flags & PR_STATIC)
                   return;
   
         while ((pi = pp->pr_freelist) != NULL) {          while ((pi = pp->pr_freelist) != NULL) {
                 pp->pr_freelist = pi->pi_next;                  pp->pr_freelist = pi->pi_next;
                 free(pi, pp->pr_mtype);                  free(pi, pp->pr_mtype);
Line 118  pool_get(pp, flags)
Line 130  pool_get(pp, flags)
         void *v;          void *v;
         struct pool_item *pi;          struct pool_item *pi;
   
   #ifdef DIAGNOSTIC
           if ((pp->pr_flags & PR_STATIC) && (flags & PR_MALLOCOK))
                   panic("pool_get: static");
   #endif
   
 again:  again:
         simple_lock(&pp->pr_lock);          simple_lock(&pp->pr_lock);
         if ((v = pp->pr_freelist) == NULL) {          if ((v = pp->pr_freelist) == NULL) {
Line 162  pool_put(pp, v)
Line 179  pool_put(pp, v)
                         wakeup((caddr_t)pp);                          wakeup((caddr_t)pp);
                 }                  }
         } else {          } else {
   #ifdef DIAGNOSTIC
                   if (pp->pr_flags & PR_STATIC) {
                           /* can't happen because hiwat > freecount */
                           panic("pool_put: static");
                   }
   #endif
                 /* Return to system */                  /* Return to system */
                 free(v, M_DEVBUF);                  free(v, M_DEVBUF);
   
Line 183  pool_put(pp, v)
Line 206  pool_put(pp, v)
  * Add N items to the pool   * Add N items to the pool
  */   */
 int  int
 pool_prime(pp, n)  pool_prime(pp, n, storage)
         struct pool *pp;          struct pool *pp;
         int n;          int n;
           caddr_t storage;
 {  {
         struct pool_item *pi;          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);          simple_lock(&pp->pr_lock);
         pp->pr_hiwat += n;          pp->pr_hiwat += n;
         while (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) {                  if (pi == NULL) {
                         simple_unlock(&pp->pr_lock);                          simple_unlock(&pp->pr_lock);
                         return (ENOMEM);                          return (ENOMEM);

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

CVSweb <webmaster@jp.NetBSD.org>