]> jfr.im git - irc/quakenet/newserv.git/blame - channel/channelalloc.c
PROXYSCAN: allow reglines to occur faster than new gline period, allowing opers to...
[irc/quakenet/newserv.git] / channel / channelalloc.c
CommitLineData
c86edd1d
Q
1/* channelalloc.c */
2
3#include <stdlib.h>
4#include "channel.h"
5#include <assert.h>
11032584 6#include "../core/nsmalloc.h"
c86edd1d
Q
7
8#define ALLOCUNIT 100
9
10channel *freechans;
11chanuserhash *freehash;
c86edd1d
Q
12
13void initchannelalloc() {
14 freechans=NULL;
15 freehash=NULL;
c86edd1d
Q
16}
17
18/* channel records don't have next pointers.
19 * Overload the index pointer for chaining free channels */
20
21channel *newchan() {
22 int i;
23 channel *cp;
24
25 if (freechans==NULL) {
11032584 26 freechans=(channel *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(channel));
c86edd1d
Q
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
39void 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
54chanuserhash *newchanuserhash(int hashsize) {
55 int i;
56 chanuserhash *cuhp;
57
58 if (freehash==NULL) {
11032584 59 freehash=(chanuserhash *)nsmalloc(POOL_CHANNEL,ALLOCUNIT*sizeof(chanuserhash));
c86edd1d
Q
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
11032584 69 /* Don't use nsmalloc() here since we will free this in freechanuserhash() */
c86edd1d
Q
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
81void freechanuserhash(chanuserhash *cuhp) {
82 free(cuhp->content);
83 cuhp->content=(unsigned long *)freehash;
84 freehash=cuhp;
85}