afs: Make afs_osi_Free(NULL) a no-op
[openafs.git] / src / afs / afs_osi_alloc.c
index 158bc32..4ca4987 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -10,8 +10,6 @@
 #include <afsconfig.h>
 #include "afs/param.h"
 
-RCSID
-    ("$Header$");
 
 
 
@@ -19,92 +17,53 @@ RCSID
 #include "afsincludes.h"       /* Afs-based standard headers */
 #include "afs/afs_stats.h"     /* afs statistics */
 
-#ifndef AFS_FBSD_ENV
+
 
 #ifdef AFS_AIX41_ENV
 #include "sys/lockl.h"
 #include "sys/sleep.h"
 #include "sys/syspest.h"
 #include "sys/lock_def.h"
-/*lock_t osi_fsplock = LOCK_AVAIL;*/
 #endif
 
-afs_lock_t osi_fsplock;
-
+#ifndef AFS_PRIVATE_OSI_ALLOCSPACES
 
+afs_lock_t osi_fsplock;
+afs_lock_t osi_flplock;
 
 static struct osi_packet {
     struct osi_packet *next;
-} *freePacketList = NULL, *freeSmallList;
-afs_lock_t osi_flplock;
-
-static char memZero;           /* address of 0 bytes for kmem_alloc */
+} *freePacketList = NULL, *freeSmallList = NULL;
 
-struct osimem {
-    struct osimem *next;
-};
+#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */
 
+static char memZero;           /* address of 0 bytes for kmem_alloc */
 
 void *
-afs_osi_Alloc(size_t x)
+afs_osi_Alloc(size_t size)
 {
-#if !defined(AFS_LINUX20_ENV) && !defined(AFS_FBSD_ENV)
-    register struct osimem *tm = NULL;
-    register int size;
-#endif
-
     AFS_STATCNT(osi_Alloc);
     /* 0-length allocs may return NULL ptr from AFS_KALLOC, so we special-case
      * things so that NULL returned iff an error occurred */
-    if (x == 0)
+    if (size == 0)
        return &memZero;
 
     AFS_STATS(afs_stats_cmperf.OutStandingAllocs++);
-    AFS_STATS(afs_stats_cmperf.OutStandingMemUsage += x);
+    AFS_STATS(afs_stats_cmperf.OutStandingMemUsage += size);
 #ifdef AFS_LINUX20_ENV
-    return osi_linux_alloc(x, 1);
+    return osi_linux_alloc(size, 1);
 #elif defined(AFS_FBSD_ENV)
-    return osi_fbsd_alloc(x, 1);
+    return osi_fbsd_alloc(size, 1);
 #else
-    size = x;
-    tm = (struct osimem *)AFS_KALLOC(size);
-#ifdef AFS_SUN5_ENV
-    if (!tm)
-       osi_Panic("osi_Alloc: Couldn't allocate %d bytes; out of memory!\n",
-                 size);
-#endif
-    return (void *)tm;
+    return AFS_KALLOC(size);
 #endif
 }
 
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
-
-void *
-afs_osi_Alloc_NoSleep(size_t x)
-{
-    register struct osimem *tm;
-    register int size;
-
-    AFS_STATCNT(osi_Alloc);
-    /* 0-length allocs may return NULL ptr from AFS_KALLOC, so we special-case
-     * things so that NULL returned iff an error occurred */
-    if (x == 0)
-       return &memZero;
-
-    size = x;
-    AFS_STATS(afs_stats_cmperf.OutStandingAllocs++);
-    AFS_STATS(afs_stats_cmperf.OutStandingMemUsage += x);
-    tm = (struct osimem *)AFS_KALLOC_NOSLEEP(size);
-    return (void *)tm;
-}
-
-#endif /* SUN || SGI */
-
 void
 afs_osi_Free(void *x, size_t asize)
 {
     AFS_STATCNT(osi_Free);
-    if (x == &memZero)
+    if (x == &memZero || x == NULL)
        return;                 /* check for putting memZero back */
 
     AFS_STATS(afs_stats_cmperf.OutStandingAllocs--);
@@ -114,7 +73,7 @@ afs_osi_Free(void *x, size_t asize)
 #elif defined(AFS_FBSD_ENV)
     osi_fbsd_free(x);
 #else
-    AFS_KFREE((struct osimem *)x, asize);
+    AFS_KFREE(x, asize);
 #endif
 }
 
@@ -124,7 +83,7 @@ afs_osi_FreeStr(char *x)
     afs_osi_Free(x, strlen(x) + 1);
 }
 
-
+#ifndef AFS_PRIVATE_OSI_ALLOCSPACES
 
 /* free space allocated by AllocLargeSpace.  Also called by mclput when freeing
  * a packet allocated by osi_NetReceive. */
@@ -137,10 +96,10 @@ osi_FreeLargeSpace(void *adata)
 
     AFS_STATCNT(osi_FreeLargeSpace);
     afs_stats_cmperf.LargeBlocksActive--;
-    MObtainWriteLock(&osi_flplock, 322);
+    ObtainWriteLock(&osi_flplock, 322);
     ((struct osi_packet *)adata)->next = freePacketList;
     freePacketList = adata;
-    MReleaseWriteLock(&osi_flplock);
+    ReleaseWriteLock(&osi_flplock);
 }
 
 void
@@ -151,10 +110,10 @@ osi_FreeSmallSpace(void *adata)
 
     AFS_STATCNT(osi_FreeSmallSpace);
     afs_stats_cmperf.SmallBlocksActive--;
-    MObtainWriteLock(&osi_fsplock, 323);
+    ObtainWriteLock(&osi_fsplock, 323);
     ((struct osi_packet *)adata)->next = freeSmallList;
     freeSmallList = adata;
-    MReleaseWriteLock(&osi_fsplock);
+    ReleaseWriteLock(&osi_fsplock);
 }
 
 
@@ -162,19 +121,19 @@ osi_FreeSmallSpace(void *adata)
 void *
 osi_AllocLargeSpace(size_t size)
 {
-    register struct osi_packet *tp;
+    struct osi_packet *tp;
 
     AFS_ASSERT_GLOCK();
 
     AFS_STATCNT(osi_AllocLargeSpace);
     if (size > AFS_LRALLOCSIZ)
-       osi_Panic("osi_AllocLargeSpace: size=%d\n", size);
+       osi_Panic("osi_AllocLargeSpace: size=%d\n", (int)size);
     afs_stats_cmperf.LargeBlocksActive++;
     if (!freePacketList) {
        char *p;
 
        afs_stats_cmperf.LargeBlocksAlloced++;
-       p = (char *)afs_osi_Alloc(AFS_LRALLOCSIZ);
+       p = afs_osi_Alloc(AFS_LRALLOCSIZ);
 #ifdef  KERNEL_HAVE_PIN
        /*
         * Need to pin this memory since under heavy conditions this memory
@@ -185,11 +144,11 @@ osi_AllocLargeSpace(size_t size)
 #endif
        return p;
     }
-    MObtainWriteLock(&osi_flplock, 324);
+    ObtainWriteLock(&osi_flplock, 324);
     tp = freePacketList;
     if (tp)
        freePacketList = tp->next;
-    MReleaseWriteLock(&osi_flplock);
+    ReleaseWriteLock(&osi_flplock);
     return (char *)tp;
 }
 
@@ -198,11 +157,11 @@ osi_AllocLargeSpace(size_t size)
 void *
 osi_AllocSmallSpace(size_t size)
 {
-    register struct osi_packet *tp;
+    struct osi_packet *tp;
 
     AFS_STATCNT(osi_AllocSmallSpace);
     if (size > AFS_SMALLOCSIZ)
-       osi_Panic("osi_AllocSmallS: size=%d\n", size);
+       osi_Panic("osi_AllocSmallS: size=%d\n", (int)size);
 
     if (!freeSmallList) {
        afs_stats_cmperf.SmallBlocksAlloced++;
@@ -214,22 +173,20 @@ osi_AllocSmallSpace(size_t size)
         return (char *)tp;
     }
     afs_stats_cmperf.SmallBlocksActive++;
-    MObtainWriteLock(&osi_fsplock, 327);
+    ObtainWriteLock(&osi_fsplock, 327);
     tp = freeSmallList;
     if (tp)
        freeSmallList = tp->next;
-    MReleaseWriteLock(&osi_fsplock);
+    ReleaseWriteLock(&osi_fsplock);
     return (char *)tp;
 }
-
-
+#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */
 
 void
 shutdown_osinet(void)
 {
-    extern int afs_cold_shutdown;
-
     AFS_STATCNT(shutdown_osinet);
+#ifndef AFS_PRIVATE_OSI_ALLOCSPACES
     if (afs_cold_shutdown) {
        struct osi_packet *tp;
 
@@ -251,5 +208,13 @@ shutdown_osinet(void)
        LOCK_INIT(&osi_fsplock, "osi_fsplock");
        LOCK_INIT(&osi_flplock, "osi_flplock");
     }
+#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */
+    if (afs_stats_cmperf.LargeBlocksActive ||
+       afs_stats_cmperf.SmallBlocksActive)
+    {
+       afs_warn("WARNING: not all blocks freed: large %d small %d\n",
+                afs_stats_cmperf.LargeBlocksActive,
+                afs_stats_cmperf.SmallBlocksActive);
+    }
 }
-#endif
+