]> jfr.im git - irc/quakenet/newserv.git/blob - channel/channelalloc.c
5add18f6a06766e62212397c7b7000a26dd37127
[irc/quakenet/newserv.git] / channel / channelalloc.c
1 /* channelalloc.c */
2
3 #include <stdlib.h>
4 #include "channel.h"
5 #include <assert.h>
6 #include "../core/nsmalloc.h"
7
8 #define ALLOCUNIT 100
9
10 channel *freechans;
11 chanuserhash *freehash;
12
13 void initchannelalloc() {
14 freechans=NULL;
15 freehash=NULL;
16 }
17
18 /* channel records don't have next pointers.
19 * Overload the index pointer for chaining free channels */
20
21 channel *newchan() {
22 int i;
23 channel *cp;
24
25 if (freechans==NULL) {
26 freechans=(channel *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(channel));
27 for (i=0;i<(ALLOCUNIT-1);i++) {
28 freechans[i].index=(struct chanindex *)&(freechans[i+1]);
29 }
30 freechans[ALLOCUNIT-1].index=NULL;
31 }
32
33 cp=freechans;
34 freechans=(channel *)cp->index;
35
36 return cp;
37 }
38
39 void freechan(channel *cp) {
40 cp->index=(struct chanindex *)freechans;
41 freechans=cp;
42 }
43
44 /*
45 * Free hash for all!
46 *
47 * Since these things don't naturally have a "next" pointer
48 * we abuse the "content" pointer to build our list of free
49 * structures.
50 *
51 * Hence some somewhat bizarre casts...
52 */
53
54 chanuserhash *newchanuserhash(int hashsize) {
55 int i;
56 chanuserhash *cuhp;
57
58 if (freehash==NULL) {
59 freehash=(chanuserhash *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(chanuserhash));
60 for (i=0;i<(ALLOCUNIT-1);i++) {
61 freehash[i].content=(unsigned long *)&(freehash[i+1]);
62 }
63 freehash[ALLOCUNIT-1].content=NULL;
64 }
65
66 cuhp=freehash;
67 freehash=(chanuserhash *)cuhp->content;
68
69 /* Don't use nsmalloc() here since we will free this in freechanuserhash() */
70 cuhp->content=(unsigned long *)malloc(hashsize*sizeof(unsigned long));
71 for (i=0;i<hashsize;i++) {
72 cuhp->content[i]=nouser;
73 }
74
75 cuhp->hashsize=hashsize;
76 cuhp->totalusers=0;
77
78 return cuhp;
79 }
80
81 void freechanuserhash(chanuserhash *cuhp) {
82 free(cuhp->content);
83 cuhp->content=(unsigned long *)freehash;
84 freehash=cuhp;
85 }