]>
Commit | Line | Data |
---|---|---|
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 | ||
10 | channel *freechans; | |
11 | chanuserhash *freehash; | |
c86edd1d Q |
12 | |
13 | void 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 | ||
21 | channel *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 | ||
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) { | |
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 | ||
81 | void freechanuserhash(chanuserhash *cuhp) { | |
82 | free(cuhp->content); | |
83 | cuhp->content=(unsigned long *)freehash; | |
84 | freehash=cuhp; | |
85 | } |