]> jfr.im git - irc/quakenet/newserv.git/blobdiff - channel/channelalloc.c
Merge pull request #1 from meeb/meeb
[irc/quakenet/newserv.git] / channel / channelalloc.c
index 5add18f6a06766e62212397c7b7000a26dd37127..a71b74576c192c4b710868315e1f26ec718e64d6 100644 (file)
@@ -1,85 +1,36 @@
 /* channelalloc.c */
 
-#include <stdlib.h>
 #include "channel.h"
-#include <assert.h>
 #include "../core/nsmalloc.h"
 
-#define ALLOCUNIT  100
-
-channel *freechans;
-chanuserhash *freehash;
-
-void initchannelalloc() {
-  freechans=NULL;
-  freehash=NULL;
-}
-
-/* channel records don't have next pointers.  
- * Overload the index pointer for chaining free channels */
-
 channel *newchan() {
-  int i;
-  channel *cp;
-  
-  if (freechans==NULL) {
-    freechans=(channel *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(channel));
-    for (i=0;i<(ALLOCUNIT-1);i++) {
-      freechans[i].index=(struct chanindex *)&(freechans[i+1]);
-    }
-    freechans[ALLOCUNIT-1].index=NULL;
-  }
-  
-  cp=freechans;
-  freechans=(channel *)cp->index;
-  
-  return cp;
+  return nsmalloc(POOL_CHANNEL, sizeof(channel));
 }
 
 void freechan(channel *cp) {
-  cp->index=(struct chanindex *)freechans;
-  freechans=cp;
+  nsfree(POOL_CHANNEL, cp);
 }
 
-/*
- * Free hash for all!
- *
- * Since these things don't naturally have a "next" pointer
- * we abuse the "content" pointer to build our list of free
- * structures.
- *
- * Hence some somewhat bizarre casts...
- */
-
 chanuserhash *newchanuserhash(int hashsize) {
   int i;
-  chanuserhash *cuhp;
-  
-  if (freehash==NULL) {
-    freehash=(chanuserhash *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(chanuserhash));
-    for (i=0;i<(ALLOCUNIT-1);i++) {
-      freehash[i].content=(unsigned long *)&(freehash[i+1]);
-    }    
-    freehash[ALLOCUNIT-1].content=NULL;
-  }
-  
-  cuhp=freehash;
-  freehash=(chanuserhash *)cuhp->content;
-  
+  chanuserhash *cuhp = nsmalloc(POOL_CHANNEL, sizeof(chanuserhash));
+
+  if (!cuhp)
+    return NULL;
+
   /* Don't use nsmalloc() here since we will free this in freechanuserhash() */
   cuhp->content=(unsigned long *)malloc(hashsize*sizeof(unsigned long));
   for (i=0;i<hashsize;i++) {
     cuhp->content[i]=nouser;
   }
-  
+
   cuhp->hashsize=hashsize;
   cuhp->totalusers=0;
-  
+
   return cuhp;
 }
 
 void freechanuserhash(chanuserhash *cuhp) { 
   free(cuhp->content);
-  cuhp->content=(unsigned long *)freehash; 
-  freehash=cuhp;
+  nsfree(POOL_CHANNEL, cuhp);
 }